我正在尝试在package.json中设置一个脚本,它运行Coffeescript / Sass /等各种各样的手表。
这是我在我的服务器上使用的脚本,工作正常。
"dev": "coffee --watch --compile js/ & coffee --watch --compile controllers/ & supervisor -e html,js js/index.js",
然而,当我在本地尝试相同的脚本时,它似乎只运行第一个命令。 Windows似乎不知道如何处理&。每个命令都可以单独运行,但它们不会全部一起执行。
对于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');
我为此目的开发了concurrently。例如,cat a & cat b
可以用concurrently 'cat a' 'cat b'
实现。同时还提供了一些输出格式选项以方便使用。
将它安装为dev依赖npm install --save-dev concurrently
然后它就可以在package.json“scripts”中使用了。
我所看到的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启动脚本。 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和模块化软件包,您将摆脱这些类型的问题
mscdex的答案问题在于,没有简单的方法可以在启动后终止这些后台任务。你必须去任务经理并杀死他们。
相反,运行两个任务的最简单方法就是让它打开两个命令窗口。
例如:“开发”:“启动咖啡 - 手表 - 编译js /&启动咖啡 - 手表 - 编辑控制器/&启动主管-e html,js js / index.js
如果您运行'npm run dev',那么您将为每个进程打开一个命令窗口,它们可以单独停止。你不需要/ b开关。我正在使用“开始”:“启动webpack --watch并启动reload -b”来运行webpack并重新加载
还有一个很好的节点包叫做parallelshell。安装它:
npm install --save-dev parallelshell
然后执行:
parallelshell "command 1" "command 2" "command 3"
这种方法的优点(更多细节来自上面的链接)而不是command 1 & command 2 & command 3
包括:它是跨平台的; ctrl-c结束所有3个进程;如果一个人死了他们都死了,不像使用&
。