使用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_globals.txt,而不是package.json。这个文件将包含每个模块,就像这样,

mongoose@1.4.0
node.io@0.3.3
jquery@1.5.1
jsdom@0.2.0
cron@0.1.2

然后在命令行中运行,

< npm_globals.txt xargs npm install -g

检查它们是否正确安装,

npm list -g --depth=0

至于你是否应该这样做,我认为这完全取决于用例。对于大多数项目,这是不必要的;拥有你的项目包。Json将这些工具和依赖项封装在一起是更可取的。

但现在我发现,当我跳上一台新机器时,我总是在全局安装create-react-app和其他CLI。当版本控制不太重要时,有一种简单的方法来安装一个全局工具及其依赖项是很好的。

现在,我使用npx,一个npm包运行器,而不是全局安装包。

其他回答

所有模块从包。Json被安装到。/node_modules/

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

你可以使用一个单独的文件,比如npm_globals.txt,而不是package.json。这个文件将包含每个模块,就像这样,

mongoose@1.4.0
node.io@0.3.3
jquery@1.5.1
jsdom@0.2.0
cron@0.1.2

然后在命令行中运行,

< npm_globals.txt xargs npm install -g

检查它们是否正确安装,

npm list -g --depth=0

至于你是否应该这样做,我认为这完全取决于用例。对于大多数项目,这是不必要的;拥有你的项目包。Json将这些工具和依赖项封装在一起是更可取的。

但现在我发现,当我跳上一台新机器时,我总是在全局安装create-react-app和其他CLI。当版本控制不太重要时,有一种简单的方法来安装一个全局工具及其依赖项是很好的。

现在,我使用npx,一个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是一个项目文件。但事实确实如此。

新提示:您可能不想或不需要这样做。你可能想要做的就是把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,这样就不会有这个问题了。

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

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