为什么我更喜欢Makefiles通过package.json脚本

2021-03-23 00:54:17

在任何中等大小的Node.js项目上,您可能已经超过了package.json“脚本”部分。但由于增长逐渐,没有单一急性痛点,你可能没有注意到。有更好的方法。

在大多数Node.js项目中,您将在package.json文件中找到一个脚本部分,其中包含“build”和“test”等方便的快捷方式:

此外,具有某些名称的脚本背后存在特殊意义,如“安装”或“预付”(NPM,YARN)。

在一个新的项目上,它通常足够无辜,具有一小部分简单,自我解释的命令。但是之后…

我看到的一个图案通常在NPM脚本中提出的是单个脚本上的多种变体:

" go&#34 ;:"节点go.js --do-some-stuff&#34 ;," go; go; debug&#34 ;:"回声调试..; Debug = 1纱线Go&#34 ;," Go:有#34 ;:"纱线Go --to = \"在那里\""

go_do_stuff = node go.js --do-some-suppygo:$ {go_do_stuff} go-debug:echo调试.. debug = 1 $ {go_do_stuff} go-with-with-with-with for thate for this参数中的空格:$ {go_do_stuff } - 在那里="

另一个出现的模式 - 这是一个更险恶的一个 - 是依赖的链:

"分享 - prereq&#34 ;:" echo共享prereq!&#34 ;,"另一个prereq&#34 ;:"回声另一个prereq!&#34 ;,&# 34;任务-One&#34 ;:"纱线共享-Prereq&&回声做任务一个..&#34 ;,"任务-2&#34 ;:"纱线共享 - Prereq&&纱线另一个prereq;回声做任务二.."

Shared-Prereq:@echo共享prereq!另一个prereq:@echo另一个prereq!任务一:共享-prereq @echo做任务一。 - 二:共享 - Prereq另一个prereq @echo做任务二..

在上面的例子中,我们有一系列始终运行的步骤,只询问我们要求我们询问的NPM脚本。但是可以做得更好。

如果您的命令正在读写可预测的文件集,则可以跟踪它们并避免冗余工作。

以下是使用make来描述代码生成器的操作的示例:

json_schemas = $(shell查找schemas -type f-name' *。schoma.json')json_schema_dst = $(json_schemas:%。schema.json =%。schema.gen.ts)json2ts = yarn运行json2tsschemas /%.schema.gen.ts:schemas /%。schema.json $(json2ts)-i $< -o $ @ codegen_dst = $ {json_schema_dst} codegen:$ {codegen_dst} build:$ {codegen_dst} @echo"我依赖于那些生成的文件!" clean:find schemas -type f-name&# 34; *。Gen。*" -删除

第一次运行Build Build时,它将找到所有.schema.json文件,为每个文件生成.gen.ts,然后继续构建应用程序。

第二次运行Build Build,Make将看到生成的文件是最新的,跳过生成器,并构建您的应用程序。

如果您编辑其中一个架构文件,请注意将注意到该文件更改,运行生成器,然后构建您的应用程序。

在一个大型项目上,您可以在不同的目录中撒上多个makefiles,其中它们' ll提供与该区域相关的可发现的快捷方式。

它'如果您的shell具有智能选项卡完成,则更可被发现:例如,在我当前的项目中,如果输入AWS /目录,并且键入make< tab>,您' ll查看包含像这样的列表docker-login,deploy-dev和destroy-sandbox。

BASH-3.2 $ TIME YARN任务 - TWOYARN RUN V1.22.5 $ YARN SHARED-PREREQ&&纱线另一个prereq;回声做任务二.. $ echo共享prereq!共享prereq!$ echo另一个prereq!另一个prereq!做任务二进一程......在0.63s.real 0m0.814suser 0m0.508ssys 0m0.138sbash-3.2 $ time make - TwoShared Prereq!另一个prereq!做任务二.. eal 0m0.021suser 0m0.008ssys 0m0.010s

允许替代工具架空赢得'如果您的命令采用任何有意义的时间,但是如果您碰巧有任何脚本即时执行任何脚本,则会感受到差异。

JSON是为了序列化对象。 它' s一个糟糕的配置格式,它'甚至在表达复杂的构建时更糟糕。 当你堆积更多的复杂性进入你的NPM脚本时,它永远不会像你一样'把稻草放在骆驼'回来的那个。 但请退后一步,看看你的可怜的骆驼,并考虑使用另一个工具。 我甚至在'它的制作时甚至不在乎。 用别的东西。 也许您的语言生态系统有一个甜蜜的构建工具,可以完成以上所有内容。 我喜欢被证明是错误的,但据我所知,在node.js(特别是用lecescript),有没有人和#39; t。