强制纱线安装,而不是节点模块的npm安装?
我想强制使用yarn install
而不是npm install
。 我想在npm install
引发错误。 我应该怎么做package.json
?
在预安装脚本中,您可以运行一个适用于所有平台的迷你节点脚本,而像pgrep
(以及其他常见的* nix命令和运算符)在Windows 10得到广泛采用之前无法在Windows上运行。
我在Node v4.7.0(npm v2.15.11)和Node v7.2.1(npm v3.10.10)上testing了下面的脚本。 我认为它适用于中间的一切。 它通过检查当前正在运行的进程的环境variables来工作 – npm_execpath
是当前正在运行的“npm”脚本的path。 在纱线的情况下,它应该指向/path/to/yarn/on/your/machine/yarn.js
。
"scripts": { "preinstall": "node -e \"if(process.env.npm_execpath.indexOf('yarn') === -1) throw new Error('You must use Yarn to install, not NPM')\"" }
注意:从亚历山大的答案更新 – 这不会工作,如果用户使用
npm install --ignore-scripts
。 请在信贷到期时给予贷款。
您可以在这里阅读更多有关npm脚本的信息: https ://docs.npmjs.com/misc/scripts
至于npm_execpath
环境variables,虽然没有logging,我怀疑它会改变。 这是围绕npm
多个主要版本,它并没有真正通过“有一个更好的名字”这个testing。
像其他答案一样,我build议使用preinstall
脚本并检查您的环境。 对于一个便携式的解决scheme来说,如果另一个npm进程正在运行,那么这个解决scheme不会有误报,使用node -e 'JS_CODE'
可能是最好的select。
在这个JS代码中,你可以使用以下命令来检查包pipe理器的path:
process.env.npm_execpath
纱线的二进制是yarn.js
,与NPM使用的npm-cli.js
相比。 我们可以使用如下的正则expression式来检查这个string是否以yarn.js
。
/yarn\.js$/
通过使用这个正则expression式,我们可以确定它不会在文件系统的早些时候意外匹配。 最有可能的yarn
不会出现在文件path中,但您永远不能太确定。
这是一个最小的例子:
{ "name": "test", "version": "1.0.0", "scripts": { "preinstall": "node -e 'if(!/yarn\\.js$/.test(process.env.npm_execpath))throw new Error(\"Use yarn\")'" } }
当然,用户仍然可以绕过这个检查,编辑JSON或使用--ignore-scripts
选项:
npm install --ignore-scripts
您可以使用预安装钩子和一些shell脚本来实现这一点。
样本package.json:
"scripts": { "preinstall": "pgrep npm && exit 1" }
我刚刚发布了一个包含CLI的模块(对于npm preinstall
脚本很有用): https : //github.com/adjohnson916/use-yarn
此外,我刚刚发布了一个帮助Danger检查缺lessyarn.lock
变化的CI: https : //github.com/adjohnson916/danger-yarn-lock
另见这里的讨论: