Skip to content

Commit 6b6dd52

Browse files
author
khoden
committed
nots/*: Стабилизация trunk
Суть изменений: 1. Наполнение папки ~/.nots/nm_store/$MODDIR/node_modules прямо в builder (перед установкой модулей в $BINDIR) 2. Это все равно нужно было бы делать в nots/cli, а теперь оно наполняется заранее, что обеспечивает структуру node_modules выше по уровню, чем virtual-store (важно для кастомных резолверов пакетов, ищущих пакеты выше по иерархии) 3. Убран предварительный запуск `pnpm install`, пакеты качаются один раз (тарболы в ya make) 4. После `ya make` все равно запускается `pnpm install` для гарантии (там еще всякие действия делаются) # Всем, кого робот призовет в PR ## Пожалуйста, игнорируйте, это массовая проверка, в транк не попадут изменения в ваших проектах ## Нам нужно лишь стриггерить CI, чтобы проверить, что никто не сломался. Правки в pnpm-lock.yaml файлах будет откачены. commit_hash:d124ecb77bda10bd8e975078382c685ac35c8928
1 parent 41a55c6 commit 6b6dd52

File tree

5 files changed

+65
-16
lines changed

5 files changed

+65
-16
lines changed

build/plugins/lib/nots/package_manager/base/package_json.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
import json
2-
import logging
32
import os
43

54
from six import iteritems
65

6+
import logging
77
from .utils import build_pj_path
88

9+
910
logger = logging.getLogger(__name__)
1011

1112

@@ -247,3 +248,6 @@ def covered(k: str) -> bool:
247248
messages.extend([f" - {key}" for key in missing_overrides])
248249

249250
return (not messages, messages)
251+
252+
def get_pnpm_patched_dependencies(self) -> dict[str, str]:
253+
return self.data.get("pnpm", {}).get("patchedDependencies", {})

build/plugins/lib/nots/package_manager/base/package_manager.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
import os
2-
import sys
32
import subprocess
4-
3+
import sys
54
from abc import ABCMeta, abstractmethod
65
from six import add_metaclass
76

87
from .constants import NPM_REGISTRY_URL
98
from .package_json import PackageJson
109
from .utils import build_nm_path, build_pj_path
10+
from .timeit import timeit
1111

1212

1313
class PackageManagerError(RuntimeError):
@@ -126,7 +126,8 @@ def get_peers_from_package_json(self):
126126

127127
return [p[prefix_len:] for p in pj.get_workspace_map(ignore_self=True).keys()]
128128

129-
def _exec_command(self, args, include_defaults=True, script_path=None, env=None):
129+
@timeit
130+
def _exec_command(self, args, cwd: str, include_defaults=True, script_path=None, env=None):
130131
if not self.nodejs_bin_path:
131132
raise PackageManagerError("Unable to execute command: nodejs_bin_path is not configured")
132133

@@ -135,9 +136,7 @@ def _exec_command(self, args, include_defaults=True, script_path=None, env=None)
135136
+ args
136137
+ (self._get_default_options() if include_defaults else [])
137138
)
138-
p = subprocess.Popen(
139-
cmd, cwd=self.build_path, stdin=None, stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=env
140-
)
139+
p = subprocess.Popen(cmd, cwd=cwd, stdin=None, stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=env)
141140
stdout, stderr = p.communicate()
142141

143142
if p.returncode != 0:

build/plugins/lib/nots/package_manager/npm/npm_package_manager.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import os
22

3-
43
from ..base import BasePackageManager, PackageManagerError
54
from ..base.constants import NODE_MODULES_WORKSPACE_BUNDLE_FILENAME
65
from ..base.node_modules_bundler import bundle_node_modules
@@ -157,7 +156,7 @@ def _install_node_modules(self):
157156
env = os.environ.copy()
158157
env.update({"NPM_CONFIG_CACHE": os.path.join(self.build_path, ".npm-cache")})
159158

160-
self._exec_command(install_cmd, env=env)
159+
self._exec_command(install_cmd, cwd=self.build_path, env=env)
161160

162161
def _prepare_workspace(self):
163162
lf = self.load_lockfile(build_pre_lockfile_path(self.build_path))

build/plugins/lib/nots/package_manager/pnpm/package_manager.py

Lines changed: 54 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,9 @@
55
from .utils import build_lockfile_path, build_pre_lockfile_path, build_ws_config_path
66
from .workspace import PnpmWorkspace
77
from ..base import BasePackageManager, PackageManagerError
8-
from ..base.constants import NODE_MODULES_WORKSPACE_BUNDLE_FILENAME
8+
from ..base.constants import NODE_MODULES_WORKSPACE_BUNDLE_FILENAME, PACKAGE_JSON_FILENAME, PNPM_LOCKFILE_FILENAME
99
from ..base.node_modules_bundler import bundle_node_modules
10+
from ..base.package_json import PackageJson
1011
from ..base.timeit import timeit
1112
from ..base.utils import (
1213
b_rooted,
@@ -46,6 +47,40 @@ def load_lockfile_from_dir(cls, dir_path):
4647
def get_local_pnpm_store():
4748
return os.path.join(home_dir(), ".cache", "pnpm-store")
4849

50+
@timeit
51+
def _create_local_node_modules(self, nm_store_path: str, store_dir: str, virtual_store_dir: str):
52+
"""
53+
Creates ~/.nots/nm_store/$MODDIR/node_modules folder (with installed packages and .pnpm/virtual-store)
54+
55+
Should be used after build for local development ($SOURCE_DIR/node_modules should be a symlink to this folder).
56+
57+
But now it is also a workaround to provide valid node_modules structure in the parent folder of virtual-store
58+
It is needed for fixing custom module resolvers (like in tsc, webpack, etc...), which are trying to find modules in the parents directories
59+
"""
60+
61+
# provide files required for `pnpm install`
62+
pj = PackageJson.load(os.path.join(self.build_path, PACKAGE_JSON_FILENAME))
63+
required_files = [
64+
PACKAGE_JSON_FILENAME,
65+
PNPM_LOCKFILE_FILENAME,
66+
*list(pj.bins_iter()),
67+
*pj.get_pnpm_patched_dependencies().values(),
68+
]
69+
70+
for f in required_files:
71+
src = os.path.join(self.build_path, f)
72+
if os.path.exists(src):
73+
dst = os.path.join(nm_store_path, f)
74+
try:
75+
os.remove(dst)
76+
except FileNotFoundError:
77+
pass
78+
79+
os.makedirs(os.path.dirname(dst), exist_ok=True)
80+
shutil.copy(src, dst)
81+
82+
self._run_pnpm_install(store_dir, virtual_store_dir, nm_store_path)
83+
4984
@timeit
5085
def create_node_modules(self, yatool_prebuilder_path=None, local_cli=False, bundle=True):
5186
"""
@@ -68,7 +103,10 @@ def create_node_modules(self, yatool_prebuilder_path=None, local_cli=False, bund
68103
# Use single virtual-store location in ~/.nots/nm_store/$MODDIR/node_modules/.pnpm/virtual-store
69104
virtual_store_dir = os.path.join(build_nm_path(nm_store_path), self._VSTORE_NM_PATH)
70105

71-
self._run_pnpm_install(store_dir, virtual_store_dir)
106+
self._create_local_node_modules(nm_store_path, store_dir, virtual_store_dir)
107+
108+
self._run_pnpm_install(store_dir, virtual_store_dir, self.build_path)
109+
72110
self._run_apply_addons_if_need(yatool_prebuilder_path, virtual_store_dir)
73111
self._replace_internal_lockfile_with_original(virtual_store_dir)
74112

@@ -81,7 +119,7 @@ def create_node_modules(self, yatool_prebuilder_path=None, local_cli=False, bund
81119
)
82120

83121
@timeit
84-
def _run_pnpm_install(self, store_dir: str, virtual_store_dir: str):
122+
def _run_pnpm_install(self, store_dir: str, virtual_store_dir: str, cwd: str):
85123
install_cmd = [
86124
"install",
87125
"--frozen-lockfile",
@@ -100,8 +138,9 @@ def _run_pnpm_install(self, store_dir: str, virtual_store_dir: str):
100138
virtual_store_dir,
101139
]
102140

103-
self._exec_command(install_cmd)
141+
self._exec_command(install_cmd, cwd=cwd)
104142

143+
@timeit
105144
def calc_prepare_deps_inouts_and_resources(
106145
self, store_path: str, has_deps: bool
107146
) -> tuple[list[str], list[str], list[str]]:
@@ -122,6 +161,7 @@ def calc_prepare_deps_inouts_and_resources(
122161

123162
return ins, outs, resources
124163

164+
@timeit
125165
def calc_node_modules_inouts(self, local_cli: bool, has_deps: bool) -> tuple[list[str], list[str]]:
126166
"""
127167
Returns input and output paths for command that creates `node_modules` bundle.
@@ -139,6 +179,7 @@ def calc_node_modules_inouts(self, local_cli: bool, has_deps: bool) -> tuple[lis
139179

140180
return ins, outs
141181

182+
@timeit
142183
def extract_packages_meta_from_lockfiles(self, lf_paths):
143184
"""
144185
:type lf_paths: iterable of BaseLockfile
@@ -167,6 +208,7 @@ def _prepare_workspace(self):
167208

168209
return PnpmWorkspace.load(build_ws_config_path(self.build_path))
169210

211+
@timeit
170212
def build_workspace(self, tarballs_store: str):
171213
"""
172214
:rtype: PnpmWorkspace
@@ -182,6 +224,7 @@ def build_workspace(self, tarballs_store: str):
182224

183225
return ws
184226

227+
@timeit
185228
def _build_merged_pre_lockfile(self, tarballs_store, dep_paths):
186229
"""
187230
:type dep_paths: list of str
@@ -199,6 +242,7 @@ def _build_merged_pre_lockfile(self, tarballs_store, dep_paths):
199242

200243
lf.write()
201244

245+
@timeit
202246
def _build_merged_workspace_config(self, ws, dep_paths):
203247
"""
204248
NOTE: This method mutates `ws`.
@@ -223,10 +267,12 @@ def _run_apply_addons_if_need(self, yatool_prebuilder_path, virtual_store_dir):
223267
"--virtual-store",
224268
virtual_store_dir,
225269
],
270+
cwd=self.build_path,
226271
include_defaults=False,
227272
script_path=os.path.join(yatool_prebuilder_path, "build", "bin", "prebuilder.js"),
228273
)
229274

275+
@timeit
230276
def _replace_internal_lockfile_with_original(self, virtual_store_dir):
231277
original_lf_path = build_lockfile_path(self.sources_path)
232278
vs_lf_path = os.path.join(virtual_store_dir, "lock.yaml")
@@ -236,14 +282,15 @@ def _replace_internal_lockfile_with_original(self, virtual_store_dir):
236282
@timeit
237283
def _copy_pnpm_patches(self):
238284
pj = self.load_package_json_from_dir(self.sources_path)
239-
patchedDependencies: dict[str, str] = pj.data.get("pnpm", {}).get("patchedDependencies", {})
285+
patched_dependencies: dict[str, str] = pj.data.get("pnpm", {}).get("patchedDependencies", {})
240286

241-
for p in patchedDependencies.values():
287+
for p in patched_dependencies.values():
242288
patch_source_path = os.path.join(self.sources_path, p)
243289
patch_build_path = os.path.join(self.build_path, p)
244290
os.makedirs(os.path.dirname(patch_build_path), exist_ok=True)
245291
shutil.copyfile(patch_source_path, patch_build_path)
246292

293+
@timeit
247294
def _get_default_options(self):
248295
return super(PnpmPackageManager, self)._get_default_options() + [
249296
"--stream",
@@ -252,5 +299,6 @@ def _get_default_options(self):
252299
"--no-color",
253300
]
254301

302+
@timeit
255303
def _get_debug_log_path(self):
256304
return self._nm_path(".pnpm-debug.log")

build/plugins/lib/nots/package_manager/ya.make

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ PY3_LIBRARY()
44

55
STYLE_PYTHON()
66

7-
87
PY_SRCS(
98
__init__.py
109
)

0 commit comments

Comments
 (0)