Skip to content

Commit 3e36ca9

Browse files
committed
adds attr yarn_lock to yarn_modules to supply a yarn.lock to guarantee
consistent builds across `bazel clean` and new workspace installs. on error prints message: "error Your lockfile needs to be updated, but yarn was run with `--frozen-lockfile`." when no lock file is provided provides a warning with instructions
1 parent 1c60708 commit 3e36ca9

File tree

3 files changed

+323
-5
lines changed

3 files changed

+323
-5
lines changed

node/internal/yarn_modules.bzl

+25-5
Original file line numberDiff line numberDiff line change
@@ -43,15 +43,14 @@ def _yarn_modules_impl(ctx):
4343
sha256 = "472add7ad141c75811f93dca421e2b7456045504afacec814b0565f092156250",
4444
stripPrefix = "package",
4545
)
46-
46+
4747
# Copy over or create the package.json file
4848
if ctx.attr.package_json:
4949
package_json_file = ctx.path(ctx.attr.package_json)
5050
execute(ctx, ["cp", package_json_file, "package.json"])
5151
else:
5252
ctx.file("package.json", _create_package_json_content(ctx).to_json())
5353

54-
5554
# Copy the parse_yarn_lock script and yarn.js over here.
5655
execute(ctx, ["cp", parse_yarn_lock_js, "internal/parse_yarn_lock.js"])
5756
execute(ctx, ["cp", clean_node_modules_js, "internal/clean_node_modules.js"])
@@ -64,16 +63,30 @@ def _yarn_modules_impl(ctx):
6463
fail("Required install tool '%s' is not in the PATH" % tool, "install_tools")
6564
install_path.append(tool_path.dirname)
6665
install_path.append("$PATH")
67-
66+
67+
install_cmd = [node, yarn_js, "install"]
68+
if ctx.attr.yarn_lock:
69+
ctx.symlink(ctx.attr.yarn_lock, ctx.path("yarn.lock"))
70+
# Throws an error if yarn.lock is out of sync with
71+
# package.json. No new yarn.lock file will be generated with
72+
# --frozen-lock.
73+
# See more comments re: --frozen-lockfile here:
74+
# https://github.com/yarnpkg/website/issues/700#issuecomment-340993837
75+
install_cmd.append("--frozen-lockfile")
76+
else:
77+
print("yarn_lock attr not provided to rule '%s', " % ctx.attr.name,
78+
"unable to guarantee reproducible builds.",
79+
"Copy the generated lockfile from %s and commit to version control" % ctx.path("yarn.lock"))
80+
6881
# Build node_modules via 'yarn install'
69-
execute(ctx, [node, yarn_js, "install"], quiet = True, environment = {
82+
execute(ctx, install_cmd, quiet = True, environment = {
7083
"PATH": ":".join(install_path),
7184
})
7285

7386
# Sadly, pre-existing BUILD.bazel files located in npm modules can
7487
# screw up package boudaries. Remove these.
7588
execute(ctx, [node, "internal/clean_node_modules.js"], quiet = True)
76-
89+
7790
# Run the script and save the stdout to our BUILD file(s)
7891
parse_args = ["--resolve=%s:%s" % (k, v) for k, v in ctx.attr.resolutions.items()]
7992
result = execute(ctx, [node, "internal/parse_yarn_lock.js"] + parse_args, quiet = True)
@@ -129,6 +142,13 @@ yarn_modules = repository_rule(
129142
default = Label("@yarn//:bin/yarn.js"),
130143
single_file = True,
131144
),
145+
# If specified, symlinks the provided file to yarn.lock in the
146+
# yarn_modules repository and runs yarn install with the
147+
# --frozen-lockfile flag.
148+
"yarn_lock": attr.label(
149+
allow_single_file = True,
150+
mandatory = False,
151+
),
132152
# If specififed, augment the PATH environment variable with these
133153
# tools during 'yarn install'.
134154
"install_tools": attr.string_list(),

tests/express/WORKSPACE

+1
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,5 @@ yarn_modules(
1212
package_json = "//:package.json",
1313
# Allows yarn to unpack the express-session git repo in package.json
1414
install_tools = ["git"],
15+
yarn_lock = "//:yarn.lock",
1516
)

tests/express/yarn.lock

+297
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,297 @@
1+
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
2+
# yarn lockfile v1
3+
4+
5+
accepts@~1.3.3:
6+
version "1.3.5"
7+
resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2"
8+
dependencies:
9+
mime-types "~2.1.18"
10+
negotiator "0.6.1"
11+
12+
array-flatten@1.1.1:
13+
version "1.1.1"
14+
resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
15+
16+
content-disposition@0.5.2:
17+
version "0.5.2"
18+
resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4"
19+
20+
content-type@~1.0.2:
21+
version "1.0.4"
22+
resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
23+
24+
cookie-signature@1.0.6:
25+
version "1.0.6"
26+
resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
27+
28+
cookie@0.3.1:
29+
version "0.3.1"
30+
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb"
31+
32+
crc@3.4.4:
33+
version "3.4.4"
34+
resolved "https://registry.yarnpkg.com/crc/-/crc-3.4.4.tgz#9da1e980e3bd44fc5c93bf5ab3da3378d85e466b"
35+
36+
debug@2.6.8:
37+
version "2.6.8"
38+
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc"
39+
dependencies:
40+
ms "2.0.0"
41+
42+
debug@2.6.9:
43+
version "2.6.9"
44+
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
45+
dependencies:
46+
ms "2.0.0"
47+
48+
depd@1.1.1:
49+
version "1.1.1"
50+
resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359"
51+
52+
depd@~1.1.1:
53+
version "1.1.2"
54+
resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
55+
56+
destroy@~1.0.4:
57+
version "1.0.4"
58+
resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
59+
60+
ee-first@1.1.1:
61+
version "1.1.1"
62+
resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
63+
64+
encodeurl@~1.0.1:
65+
version "1.0.2"
66+
resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
67+
68+
escape-html@~1.0.3:
69+
version "1.0.3"
70+
resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
71+
72+
etag@~1.8.0:
73+
version "1.8.1"
74+
resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
75+
76+
"express-session@git+https://git@github.com/expressjs/session#v1.15.6":
77+
version "1.15.6"
78+
resolved "git+https://git@github.com/expressjs/session#89fd7156129210f2b0c350afcbdf226665a8328c"
79+
dependencies:
80+
cookie "0.3.1"
81+
cookie-signature "1.0.6"
82+
crc "3.4.4"
83+
debug "2.6.9"
84+
depd "~1.1.1"
85+
on-headers "~1.0.1"
86+
parseurl "~1.3.2"
87+
uid-safe "~2.1.5"
88+
utils-merge "1.0.1"
89+
90+
express@4.15.4:
91+
version "4.15.4"
92+
resolved "https://registry.yarnpkg.com/express/-/express-4.15.4.tgz#032e2253489cf8fce02666beca3d11ed7a2daed1"
93+
dependencies:
94+
accepts "~1.3.3"
95+
array-flatten "1.1.1"
96+
content-disposition "0.5.2"
97+
content-type "~1.0.2"
98+
cookie "0.3.1"
99+
cookie-signature "1.0.6"
100+
debug "2.6.8"
101+
depd "~1.1.1"
102+
encodeurl "~1.0.1"
103+
escape-html "~1.0.3"
104+
etag "~1.8.0"
105+
finalhandler "~1.0.4"
106+
fresh "0.5.0"
107+
merge-descriptors "1.0.1"
108+
methods "~1.1.2"
109+
on-finished "~2.3.0"
110+
parseurl "~1.3.1"
111+
path-to-regexp "0.1.7"
112+
proxy-addr "~1.1.5"
113+
qs "6.5.0"
114+
range-parser "~1.2.0"
115+
send "0.15.4"
116+
serve-static "1.12.4"
117+
setprototypeof "1.0.3"
118+
statuses "~1.3.1"
119+
type-is "~1.6.15"
120+
utils-merge "1.0.0"
121+
vary "~1.1.1"
122+
123+
finalhandler@~1.0.4:
124+
version "1.0.6"
125+
resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.0.6.tgz#007aea33d1a4d3e42017f624848ad58d212f814f"
126+
dependencies:
127+
debug "2.6.9"
128+
encodeurl "~1.0.1"
129+
escape-html "~1.0.3"
130+
on-finished "~2.3.0"
131+
parseurl "~1.3.2"
132+
statuses "~1.3.1"
133+
unpipe "~1.0.0"
134+
135+
forwarded@~0.1.0:
136+
version "0.1.2"
137+
resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84"
138+
139+
fresh@0.5.0:
140+
version "0.5.0"
141+
resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.0.tgz#f474ca5e6a9246d6fd8e0953cfa9b9c805afa78e"
142+
143+
http-errors@~1.6.2:
144+
version "1.6.2"
145+
resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736"
146+
dependencies:
147+
depd "1.1.1"
148+
inherits "2.0.3"
149+
setprototypeof "1.0.3"
150+
statuses ">= 1.3.1 < 2"
151+
152+
inherits@2.0.3:
153+
version "2.0.3"
154+
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
155+
156+
ipaddr.js@1.4.0:
157+
version "1.4.0"
158+
resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.4.0.tgz#296aca878a821816e5b85d0a285a99bcff4582f0"
159+
160+
media-typer@0.3.0:
161+
version "0.3.0"
162+
resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
163+
164+
merge-descriptors@1.0.1:
165+
version "1.0.1"
166+
resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
167+
168+
methods@~1.1.2:
169+
version "1.1.2"
170+
resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
171+
172+
mime-db@~1.33.0:
173+
version "1.33.0"
174+
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db"
175+
176+
mime-types@~2.1.18:
177+
version "2.1.18"
178+
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8"
179+
dependencies:
180+
mime-db "~1.33.0"
181+
182+
mime@1.3.4:
183+
version "1.3.4"
184+
resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53"
185+
186+
ms@2.0.0:
187+
version "2.0.0"
188+
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
189+
190+
negotiator@0.6.1:
191+
version "0.6.1"
192+
resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9"
193+
194+
on-finished@~2.3.0:
195+
version "2.3.0"
196+
resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
197+
dependencies:
198+
ee-first "1.1.1"
199+
200+
on-headers@~1.0.1:
201+
version "1.0.1"
202+
resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7"
203+
204+
parseurl@~1.3.1, parseurl@~1.3.2:
205+
version "1.3.2"
206+
resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3"
207+
208+
path-to-regexp@0.1.7:
209+
version "0.1.7"
210+
resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
211+
212+
proxy-addr@~1.1.5:
213+
version "1.1.5"
214+
resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-1.1.5.tgz#71c0ee3b102de3f202f3b64f608d173fcba1a918"
215+
dependencies:
216+
forwarded "~0.1.0"
217+
ipaddr.js "1.4.0"
218+
219+
qs@6.5.0:
220+
version "6.5.0"
221+
resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.0.tgz#8d04954d364def3efc55b5a0793e1e2c8b1e6e49"
222+
223+
random-bytes@~1.0.0:
224+
version "1.0.0"
225+
resolved "https://registry.yarnpkg.com/random-bytes/-/random-bytes-1.0.0.tgz#4f68a1dc0ae58bd3fb95848c30324db75d64360b"
226+
227+
range-parser@~1.2.0:
228+
version "1.2.0"
229+
resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e"
230+
231+
send@0.15.4:
232+
version "0.15.4"
233+
resolved "https://registry.yarnpkg.com/send/-/send-0.15.4.tgz#985faa3e284b0273c793364a35c6737bd93905b9"
234+
dependencies:
235+
debug "2.6.8"
236+
depd "~1.1.1"
237+
destroy "~1.0.4"
238+
encodeurl "~1.0.1"
239+
escape-html "~1.0.3"
240+
etag "~1.8.0"
241+
fresh "0.5.0"
242+
http-errors "~1.6.2"
243+
mime "1.3.4"
244+
ms "2.0.0"
245+
on-finished "~2.3.0"
246+
range-parser "~1.2.0"
247+
statuses "~1.3.1"
248+
249+
serve-static@1.12.4:
250+
version "1.12.4"
251+
resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.12.4.tgz#9b6aa98eeb7253c4eedc4c1f6fdbca609901a961"
252+
dependencies:
253+
encodeurl "~1.0.1"
254+
escape-html "~1.0.3"
255+
parseurl "~1.3.1"
256+
send "0.15.4"
257+
258+
setprototypeof@1.0.3:
259+
version "1.0.3"
260+
resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04"
261+
262+
"statuses@>= 1.3.1 < 2":
263+
version "1.4.0"
264+
resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087"
265+
266+
statuses@~1.3.1:
267+
version "1.3.1"
268+
resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e"
269+
270+
type-is@~1.6.15:
271+
version "1.6.16"
272+
resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194"
273+
dependencies:
274+
media-typer "0.3.0"
275+
mime-types "~2.1.18"
276+
277+
uid-safe@~2.1.5:
278+
version "2.1.5"
279+
resolved "https://registry.yarnpkg.com/uid-safe/-/uid-safe-2.1.5.tgz#2b3d5c7240e8fc2e58f8aa269e5ee49c0857bd3a"
280+
dependencies:
281+
random-bytes "~1.0.0"
282+
283+
unpipe@~1.0.0:
284+
version "1.0.0"
285+
resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
286+
287+
utils-merge@1.0.0:
288+
version "1.0.0"
289+
resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8"
290+
291+
utils-merge@1.0.1:
292+
version "1.0.1"
293+
resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
294+
295+
vary@~1.1.1:
296+
version "1.1.2"
297+
resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"

0 commit comments

Comments
 (0)