使用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被安装到。/node_modules/

我找不到明确的说明,但这是包。json引用NPM。

这可能是生产中出现问题的原因。 如果项目依赖项安装在项目文件夹之外,如果其他人删除或替换你的包或更改文件夹权限,代码可能会中断。

将所有东西都放在一个文件夹中更持久,使系统更可预测,维护任务也更容易。

构建自己的脚本来安装全局依赖项。这并不需要太多。包中。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是一个项目文件。但事实确实如此。