我正在尝试在package.json中设置一个脚本,该脚本运行Coffeescript / Sass / etc的所有各种手表。
这是我在服务器上使用的脚本,效果很好。
"dev": "coffee --watch --compile js/ & coffee --watch --compile controllers/ & supervisor -e html,js js/index.js",
但是当我在本地尝试相同的脚本时,它似乎只运行第一个命令。 Windows似乎不知道如何处理&amp ;.每个命令都可以单独运行,但它们不会全部一起执行。
答案 0 :(得分:14)
我为此目的开发了concurrently。例如,可以使用cat a & cat b
来实现concurrently 'cat a' 'cat b'
。同时还提供了一些输出格式选项以方便使用。
将其安装为dev依赖项npm install --save-dev concurrently
,然后就可以在package.json“scripts”中使用它。
答案 1 :(得分:5)
npm-run-all
来自我所见过的最受欢迎的套餐。它将脚本run-s
(顺序)和run-p
(并行)添加到项目bin中,使它们可以从项目脚本部分使用。
对于以下package.json
脚本:
"scripts": {
"start": "npm run build -- --watch",
"prebuild": "rimraf lib dist",
"build:dist": "rollup -c --sourcemap inline --environment NODE_ENV:production",
"build": "babel src -d lib --ignore __tests__,__mocks__",
"preversion": "npm run build && npm run build:dist",
"test": "jest"
}
如果您想使用npm-run-all
修改preversion脚本,可以将其缩短为run-s build build:dist
。如果您希望它们并行运行,而不是按顺序运行,则可以使用:run-p build build:dist
。它具有恢复错误,将参数传递给所有脚本以及跨平台工作的选项。
最近,我将我的项目分成了微模块。一旦我开始面对你遇到的那种问题,这表明我的项目太大了。大型项目有利于能够找到所有内容并为每个版本保留单个版本,但会导致构建和部署问题。对于大型回购,您必须为以下类型的事物编排单独的构建:
NODE_ENV
)它会将你的package.json变成灾难。
要解决这些问题并仍然保持良好的版本控制和协调,我会在每个项目上使用 Lerna (npm i -g lerna@prerelease
)。它设置了一个带有packages/
目录的monorepo,该目录包含你的每个项目npm包。执行lerna bootstrap
然后lerna run start
链接所有彼此依赖的包,然后在定义一个包的所有包中运行npm start脚本。 lerna run
命令默认并行执行,但可以使用--concurrency=1
顺序运行。我发现没有一个项目太小,无法保证使用lerna,它使小项目变得不那么繁琐。
create-react-app
是将生态系统转变为模块化设计的项目的一个很好的例子。它有基本要素,3个脚本(start
,test
,build
)和第4个eject
脚本,其唯一用途是将基础模块化构建系统呕吐到项目中目录。它非常快速和热量重新加载很好,但你没有选择(常见的误解)。你实际上处于更好的状态而不是弹出,并从一个永不失败的构建系统中受益,它将获得可靠的升级。在模块之间水平 ,而不是指数在所有方向上。
为了将此设计应用于create-react-app
未涵盖的许多构建系统(一件好事),我创建了noderaider/modular lerna repo。它的工作原理基本上与create-react-app
相同,但其目标是CLI / API模块创建包,它与Lerna
和create-react-app
的上游配合得很好。我根据公约create-<target>-module
发布了夜莺。这些包中的每一个都可以从CLI,package.json脚本运行,或通过其节点API进行编排。如果在路径中找到,则使用yarn进行安装,否则返回npm
。它拥有适用于webpack 2,汇总,postcss和CLI软件包的当前工作支架,以及单元测试和代码覆盖。我目前正在开发模块化脚本,与lerna
/ create-react-app
进一步凝聚,并完成roadmap上的其余模块。欢迎拉/特色要求。期待每个软件包快速向您推出一个可构建的,可测试的,可发布的软件包,travis-ci集成并在1.0.0
每semver之前快速更改。
TL; DR 使用Lerna和模块化软件包,您将摆脱这些类型的问题
答案 2 :(得分:3)
对于Windows,相当于&
的内置等效命令会在命令前加上start /B
。因此,您可能只需将“dev”设置为使用内置child_process
执行以下操作的小节点脚本:
var exec = require('child_process').exec;
var prefix = (process.platform === 'win32' ? 'start /B ' : '');
exec(prefix + 'coffee --watch --compile js/');
exec(prefix + 'coffee --watch --compile controllers/');
exec(prefix + 'supervisor -e html,js js/index.js');
答案 3 :(得分:0)
mscdex的答案问题在于,没有简单的方法可以在启动后终止这些后台任务。你必须去任务经理并杀死它们。
相反,运行两个任务的最简单方法就是让它打开两个命令窗口。
ex:“dev”:“start coffee --watch --compile js /&amp; start coffee --watch --compile controllers /&amp; start supervisor -e html,js js / index.js
如果您运行'npm run dev',那么您将为每个进程打开一个命令窗口,它们可以单独停止。你不需要/ b开关。我正在使用“开始”:“启动webpack --watch&amp; start reload -b”运行webpack并重新加载
答案 4 :(得分:0)
还有一个名为parallelshell的好节点包。安装时使用:
npm install --save-dev parallelshell
然后执行:
parallelshell "command 1" "command 2" "command 3"
这种方法的优点(来自上面的链接的更多细节)而不是command 1 & command 2 & command 3
包括:它是跨平台的; ctrl-c结束所有3个进程;如果一个人死了,他们都会死,不像使用&
。