使用npm,我们可以使用-g选项全局安装模块。我们如何在包装中做到这一点。json文件吗?
假设这些是我在包中的依赖项。json文件
"dependencies": {
"mongoose": "1.4.0",
"node.io" : "0.3.3",
"jquery" : "1.5.1",
"jsdom" : "0.2.0",
"cron" : "0.1.2"
}
当我运行npm install时,我只需要node。IO将全局安装,其余的其他应安装在本地。有其他选择吗?
由于以下所述的缺点,我建议遵循以下公认的答案:
使用npm install——save-dev [package_name]然后执行脚本:
运行lint
运行构建
$ NPM测试
以下是我最初但不推荐的回答。
而不是使用全局安装,你可以将包添加到你的devDependencies(——save-dev),然后从项目中的任何地方运行二进制文件:
"$(npm bin)/<executable_name>" <arguments>...
在你的情况下:
"$(npm bin)"/node.io --help
这个工程师提供了一个npm-exec别名作为快捷方式。这个工程师使用一个名为env.sh的shell脚本。但我更喜欢直接使用$(npm bin),以避免任何额外的文件或设置。
虽然它会使每个调用更大一点,但它应该可以工作,防止:
与全局包的潜在依赖冲突(@nalply)
对sudo的需求
需要设置一个npm前缀(尽管我还是建议使用一个)
缺点:
$(npm bin)在Windows上不起作用。
在你的开发树中较深的工具不会出现在npm bin文件夹中。(安装npm-run或npm-which来找到它们。)
更好的解决方案似乎是将常见任务(如构建和缩小)放在包的“脚本”部分。json,正如Jason在上面演示的那样。
新提示:您可能不想或不需要这样做。你可能想要做的就是把build/test等类型的命令依赖放在package.json的devDependencies部分。任何时候你使用包中的脚本。json你的devDependencies命令(在node_modules/.bin中)就像它们在你的路径中一样。
例如:
npm i --save-dev mocha # Install test runner locally
npm i --save-dev babel # Install current babel locally
然后在package.json中:
// devDependencies has mocha and babel now
"scripts": {
"test": "mocha",
"build": "babel -d lib src",
"prepublish": "babel -d lib src"
}
然后在命令提示符下运行:
npm run build # finds babel
npm test # finds mocha
npm publish # will run babel first
注意:现在我们已经有了npx,它允许你运行devDependencies命令,而不需要将它们添加到你的脚本部分(如果你想的话)。
例如:
npx webpack
但是如果你真的想要全局安装,你可以在package.json的scripts部分添加一个preinstall:
"scripts": {
"preinstall": "npm i -g themodule"
}
所以实际上我的npm install再次执行npm install…这很奇怪,但似乎很有效。
注意:如果你正在使用最常见的npm设置,其中全局Node包安装需要sudo,你可能会遇到问题。一种选择是改变你的npm配置,这样就没有必要了:
npm配置~/npm,添加$HOME/npm/bin到$PATH,添加export PATH=$HOME/npm/bin:$PATH到~/.bashrc
另一个更好的选择是使用nvm来管理Node,这样就不会有这个问题了。
构建自己的脚本来安装全局依赖项。这并不需要太多。包中。Json是相当可扩展的。
const { execSync } = require('child_process');
const fs = require('fs');
const package = JSON.parse(fs.readFileSync('package.json'));
let keys = Object.keys(package.dependencies);
let values = Object.values(package.dependencies);
for (let index = 0; index < keys.length; index++) {
const key = keys[index];
let value = values[index].replace("~", "").replace("^", "");
console.log(`Installing: ${key}@${value} globally`,);
execSync('npm i -g ' + `${key}@${value}`);
}
使用上面的,你甚至可以使它内联,下面!
请看下面的preinstall:
{
"name": "Project Name",
"version": "0.1.0",
"description": "Project Description",
"main": "app.js",
"scripts": {
"preinstall": "node -e \"const {execSync} = require('child_process'); JSON.parse(fs.readFileSync('package.json')).globalDependencies.forEach(globaldep => execSync('npm i -g ' + globaldep));\"",
"build": "your transpile/compile script",
"start": "node app.js",
"test": "./node_modules/.bin/mocha --reporter spec",
"patch-release": "npm version patch && npm publish && git add . && git commit -m \"auto-commit\" && git push --follow-tags"
},
"dependencies": [
},
"globalDependencies": [
"cordova@8.1.2",
"ionic",
"potato"
],
"author": "author",
"license": "MIT",
"devDependencies": {
"chai": "^4.2.0",
"mocha": "^5.2.0"
},
"bin": {
"app": "app.js"
}
}
节点的作者可能不承认包。Json是一个项目文件。但事实确实如此。