使用不同于package.json的配置的npm

108*_*ams 2 node.js npm package.json npm-install

我有一个由package.json驱动的复杂生产环境.

问题: 我希望在本地安装一些额外的软件包,密切关注它们的列表和版本.

解决方案(如何到达): 指向npm使用另一个配置文件,从git中排除,这将保留我的私有依赖项.使用该文件通过npm install将包添加到本地node_modules.所以我真正需要的是改变npm的配置上下文.

我不知道如何指向npm使用不同的配置(类似于gulp -gulpfile).

从注释更新 dev-dependencies不是要走的路.我使用的东西90%的其他开发人员不需要安装在他们的node_modules中(事实上,我可以以一种奇怪的方式破坏他们的环境,更新git-shared核心项目范围的package.json中的 dev-dependencies ).

Luí*_*ito 5

首先,你应该知道你所尝试的不仅是奇怪的,而且还反对NodeJS中的许多良好实践和模式.

尽管如此,它是可能的,如果做得好,几乎不会给你或其他开发人员带来任何麻烦.

您可以使用Meteor构建流程中的一点灵感.让我们将您的项目概念分为两​​个不同的部分:

  • Base:处理项目初始化.
  • 内部原始项目.

项目结构:

- build.js (base build script)
- package.json (base package)
- internal/
  - package.template.json (project package template)
  - app.js (your actual project files)
  - [...]  (your actual project files)
Run Code Online (Sandbox Code Playgroud)

起点是在项目的根目录中为Base创建一个package.json文件.此包将仅包含构建Internal项目的包文件的依赖项.我强烈建议您使用类似Mozilla的Convict来确保使用ENV正确完成配置.这里的目标是在运行时编写另一个文件.package.json

我们还假设在您的环境中有一个环境变量USE_WEIRD_MODULES="true".您可以在Base项目中使用此事实来定义要使用build.js文件安装的模块.您可以在运行时阅读和编辑.准备好后,将其保存为internal/package.json.然后,npm installinternal/目录中运行.


build.js

let pkg = require('./package.template.json');    

if(process.env.USE_WEIRD_MODULES) {

    // Install your weird packages        
    pkg.dependencies.some_dev_package = '^v0.2.2';
    pkg.dependencies.another_dev_package = '^v0.2.2';


}

// Don't forget to save the package.json in the end
fs.writeFileSync('./internal/package.json', JSON.stringify(pkg, null, 2), 'utf8');
Run Code Online (Sandbox Code Playgroud)

不要忘记将internal/package.json文件放在存储库忽略文件中(例如:gitignore).

为了最大限度地减少项目中这种暴力变化的影响,您可以在主要内容中定义脚本中的package.json所有构建例程postinstall.它将允许npm install项目根目录中的一个简单的内部处理所有这些步骤.

像这样的东西:

的package.json

{
  [...]
  "scripts": {
    "postinstall": "node build.js && cd internal/ && npm install",
    "start": "node internal/app.js"
  }
  [...]
}
Run Code Online (Sandbox Code Playgroud)