Skip to content

Commit 5e27ae9

Browse files
authored
javascript: package yarn v2 (#20540)
Add support for `pants package` using yarn@v2. Currently when trying to package a yarn@v2 project, the following error occurs: ``` Engine traceback: in `package` goal ProcessExecutionFailure: Process 'Installing [email protected].' failed with exit code 1. stdout: ➤ YN0050: The --frozen-lockfile option is deprecated; use --immutable and/or --immutable-cache instead stderr: ``` Thats because the option `--frozen-lockfile` was replaced with `--immutable` on yarn >= 2. This behavior can be reproducible at https://github.com/kevinobruno/pants-yarn running `pants package //yarnv2`
1 parent ef03520 commit 5e27ae9

File tree

2 files changed

+54
-1
lines changed

2 files changed

+54
-1
lines changed

src/python/pants/backend/javascript/nodejs_project.py

+9-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
from pathlib import PurePath
99
from typing import Iterable
1010

11+
import nodesemver
12+
1113
from pants.backend.javascript import package_json
1214
from pants.backend.javascript.package_json import (
1315
AllPackageJson,
@@ -78,7 +80,13 @@ def generate_lockfile_args(self) -> tuple[str, ...]:
7880
def immutable_install_args(self) -> tuple[str, ...]:
7981
if self.package_manager == "npm":
8082
return ("clean-install",)
81-
return ("install", "--frozen-lockfile")
83+
if self.package_manager == "pnpm":
84+
return ("install", "--frozen-lockfile")
85+
if self.package_manager == "yarn":
86+
if nodesemver.satisfies(self.package_manager_version, "1.x"):
87+
return ("install", "--frozen-lockfile")
88+
return ("install", "--immutable")
89+
raise ValueError(f"Unsupported package manager: {self.package_manager}")
8290

8391
@property
8492
def workspace_specifier_arg(self) -> str:

src/python/pants/backend/javascript/nodejs_project_test.py

+45
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,51 @@ def test_parses_projects(rule_runner: RuleRunner) -> None:
7171
assert {project.root_dir for project in projects} == {"src/js/foo", "src/js/bar"}
7272

7373

74+
@pytest.mark.parametrize(
75+
("package_manager", "expected_immutable_install_args"),
76+
[
77+
(None, ("clean-install",)),
78+
("[email protected]", ("clean-install",)),
79+
("[email protected]", ("install", "--frozen-lockfile")),
80+
("[email protected]", ("install", "--frozen-lockfile")),
81+
("[email protected]", ("install", "--immutable")),
82+
("[email protected]", ("install", "--immutable")),
83+
],
84+
)
85+
def test_immutable_install_args_property(
86+
package_manager: None | str,
87+
expected_immutable_install_args: tuple[str],
88+
rule_runner: RuleRunner,
89+
) -> None:
90+
rule_runner.write_files(
91+
{
92+
"src/js/foo/BUILD": "package_json()",
93+
"src/js/foo/package.json": given_package(
94+
name="foo",
95+
version="0.0.1",
96+
package_manager=package_manager,
97+
),
98+
}
99+
)
100+
projects = rule_runner.request(AllNodeJSProjects, [])
101+
assert projects[0].immutable_install_args == expected_immutable_install_args
102+
103+
104+
def test_immutable_install_args_property_with_unsupported_package_manager(
105+
rule_runner: RuleRunner,
106+
) -> None:
107+
rule_runner.write_files(
108+
{
109+
"src/js/foo/BUILD": "package_json()",
110+
"src/js/foo/package.json": given_package("foo", "0.0.1", package_manager="[email protected]"),
111+
}
112+
)
113+
projects = rule_runner.request(AllNodeJSProjects, [])
114+
expected_error = "Unsupported package manager: bar"
115+
with pytest.raises(ValueError, match=expected_error):
116+
{project.immutable_install_args for project in projects}
117+
118+
74119
def test_root_package_json_is_supported(rule_runner: RuleRunner) -> None:
75120
rule_runner.write_files(
76121
{

0 commit comments

Comments
 (0)