-
-
Notifications
You must be signed in to change notification settings - Fork 636
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[internal] Generate
_go_internal_package
targets (#13139)
Closes #13049. This greatly reduces boilerplate and also allows us to make some fields required like `import_path` and `subpath`, so that we don't have to calculate those in consuming rules like `build_go_pkg.py`. ## The address format The generated address looks like `project#./dir`. @tdyas offered that this is intuitive for Go developers because they have to say `go build ./dir` already with the leading `./`. This solves how to represent when the `_go_internal_package` is in the same dir as the `go_mod`: `project#./`. This also makes very clear the difference from external packages like `project#rsc.io/quote` vs. internal packages like `project#./dir`. ## Improves dependency inference Now that the `import_path` field is required for both `_go_internal_package` and `_go_external_package`, we can create a global mapping of `import_path -> pkg_target`. This is necessary for #13114. This also improves performance. We don't need to call `ResolvedGoPackage` on all the candidate targets a package might depend on to calculate their import paths. We do still need it when resolving the deps of a particular `_go_internal_package`, but we can be lazier when we call that codepath in not evaluating all candidate targets. ### `dependencies` benchmark As expected, there is no difference because we are finding the dependencies of everything, so we still have to call `ResolvedGoPackage`. The perf gains are only in things sometimes being less eager, which isn't the case here. Before: ``` ❯ hyperfine -r 5 './pants_from_sources --no-pantsd --no-process-execution-local-cache dependencies ::' Time (mean ± σ): 26.501 s ± 1.537 s [User: 29.554 s, System: 24.115 s] Range (min … max): 24.928 s … 28.763 s 5 runs ``` After: ``` ❯ hyperfine -r 5 './pants_from_sources --no-pantsd --no-process-execution-local-cache dependencies ::' Time (mean ± σ): 26.359 s ± 0.526 s [User: 29.600 s, System: 23.769 s] Range (min … max): 25.625 s … 26.993 s 5 runs ``` ### `package` benchmark Before: ``` ❯ hyperfine -r 5 './pants_from_sources --no-pantsd --no-process-execution-local-cache package ::' Time (mean ± σ): 33.777 s ± 0.248 s [User: 39.221 s, System: 39.389 s] Range (min … max): 33.517 s … 34.062 s 5 runs ``` After: ``` ❯ hyperfine -r 5 './pants_from_sources --no-pantsd --no-process-execution-local-cache package ::' Benchmark #1: ./pants_from_sources --no-pantsd --no-process-execution-local-cache package :: Time (mean ± σ): 31.049 s ± 0.702 s [User: 40.606 s, System: 40.537 s] Range (min … max): 30.512 s … 32.273 s 5 runs ``` ## TODO: fix `go_binary` inference of `main` field #13117 added inference of the `main` field for `go_binary`, that it defaults to the `go_package` defined in that directory. But target generation no longer generates targets actually in each directory. All generated targets are "located" in the BUILD file of the `go_mod`, i.e. their `spec_path` is set to that. So it no longer looks to `AddressSpecs` like there are any targets in each subdirectory, and there are >1 `_go_internal_package` targets in the `go_mod` dir. Instead, we should use the `subpath` field to determine what directory the targets correspond to. [ci skip-rust] [ci skip-build-wheels]
- Loading branch information
1 parent
221dc1b
commit 0044d1d
Showing
21 changed files
with
351 additions
and
405 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,41 +1,46 @@ | ||
# Copyright 2021 Pants project contributors (see CONTRIBUTORS.md). | ||
# Licensed under the Apache License, Version 2.0 (see LICENSE). | ||
|
||
from __future__ import annotations | ||
|
||
import pytest | ||
|
||
from pants.backend.go import target_type_rules | ||
from pants.backend.go.goals.test import GoTestFieldSet | ||
from pants.backend.go.goals.test import rules as test_rules | ||
from pants.backend.go.target_types import GoModTarget, GoPackage | ||
from pants.backend.go.target_types import GoModTarget | ||
from pants.backend.go.util_rules import external_pkg, go_mod, go_pkg, sdk | ||
from pants.build_graph.address import Address | ||
from pants.core.goals.test import TestResult | ||
from pants.engine.internals.scheduler import ExecutionError | ||
from pants.engine.rules import QueryRule | ||
from pants.testutil.rule_runner import RuleRunner | ||
from pants.testutil.rule_runner import QueryRule, RuleRunner, engine_error | ||
|
||
|
||
@pytest.fixture | ||
def rule_runner() -> RuleRunner: | ||
rule_runner = RuleRunner( | ||
rules=[ | ||
*test_rules(), | ||
*go_mod.rules(), | ||
*go_pkg.rules(), | ||
*external_pkg.rules(), | ||
*sdk.rules(), | ||
*target_type_rules.rules(), | ||
QueryRule(TestResult, [GoTestFieldSet]), | ||
], | ||
target_types=[GoPackage, GoModTarget], | ||
target_types=[GoModTarget], | ||
) | ||
rule_runner.set_options([], env_inherit={"PATH"}) | ||
return rule_runner | ||
|
||
|
||
def test_stub_is_a_stub(rule_runner: RuleRunner) -> None: | ||
rule_runner.write_files( | ||
{ | ||
"foo/BUILD": "go_mod()\ngo_package(name='lib')\n", | ||
"foo/go.mod": "module foo\n", | ||
"foo/go.sum": "", | ||
"foo/bar_test.go": "package foo\n", | ||
"foo/BUILD": "go_mod()", | ||
"foo/go.mod": "module foo", | ||
"foo/bar_test.go": "package foo", | ||
} | ||
) | ||
|
||
with pytest.raises(ExecutionError) as exc_info: | ||
tgt = rule_runner.get_target(Address("foo", target_name="lib")) | ||
tgt = rule_runner.get_target(Address("foo", generated_name="./")) | ||
with engine_error(NotImplementedError): | ||
rule_runner.request(TestResult, [GoTestFieldSet.create(tgt)]) | ||
|
||
assert "NotImplementedError: This is a stub." in str(exc_info.value) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.