使用不同于package.json

时间:2016-03-17 09:44:21

标签: 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核心项目范围内的dev-dependencies 的package.json )。

4 个答案:

答案 0 :(得分:5)

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

然而,它是可能的,如果做得好,几乎不会给你或其他平台上的其他开发者造成任何麻烦。

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

  • 基础:处理项目初始化。
  • 内部原始项目。

项目结构:

- 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)

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

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


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');

不要忘记将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"
  }
  [...]
}

答案 1 :(得分:2)

您可以使用npm install packageName --dev代替使用seprate文件。

使用devDependencies安装软件包该软件包将进入package.json的{​​{1}},例如

"devDependencies": {
    "chai": "~3.2.0",
    "supertest": "~1.0.1",
    "morgan": "~1.6.1",
    "nodemon": "~1.8.1"
  }

所以当您在开发环境中npm install时,将安装所有依赖项,但在生产环境中将忽略依赖项

希望它有所帮助:)

答案 2 :(得分:1)

npm已经提供内置功能来完全满足此要求。要在开发环境和生产环境中使用不同的依赖项,可以通过两种不同的方式将依赖项保存到package.json中。

  1. 您可以使用save标志将其保存为普通依赖项(在开发和生产中可用)。例如:

    npm install <package-name> --save`
    
  2. 您可以使用save-dev标志将其保存为开发依赖项(仅在开发中可用,而不在生产中)。例如:

    npm install <package-name> --save-dev
    
  3. 在服务器上运行npm install时,如果NODE_ENV设置为production,则不会安装dev依赖项。

    此处有更多信息:https://docs.npmjs.com/cli/install。还有其他概念,如可选依赖项等,您也可以使用它们。

答案 3 :(得分:1)

您可以编写自己的实现。

您需要编写package.json构建器,该构建器可以生成 package.json ,其中仅需要

用法

node package.json.builder.js prod+test
npm install

此处将创建具有 package.dependencies.js 中所述的依赖项的package.json文件。

补偿

1。将package.json添加到.gitignore

2。创建文件 package.json.builder.js 将创建package.json文件

let fs = require('fs');
let pkgDep = require('./package.dependencies.js');

let pkgTemplete = fs.readFileSync('./package.json.hbs', "utf8");
let obj = {}, dep = [];

if (process.argv[2]) {
  let array = process.argv[2].split('+');

  for (let i = 0; i < array.length; i++) {
    if (!pkgDep[array[i] + 'Dependencies']) {
      console.error(array[i] + 'Dependencies' + ' not found in package.dependencies.js');
    } else {
      dep.push(array[i] + 'Dependencies');
    }

Object.assign(obj, pkgDep[array[i] + 'Dependencies'] || {});
  }
}

pkgTemplete = pkgTemplete.replace('{{dependencies}}', JSON.stringify(obj));

fs.writeFileSync('./package.json', pkgTemplete);
console.log('package.json created with ' + dep.join('+'));

3。创建 package.json.hbs (无依赖项的package.json)

{
  "name": "",
  "version": "1.0.0",
  "dependencies": {{dependencies}},
  "scripts": {
  }
}

4。创建文件 package.dependencies.js 对象,该对象仅包含软件包及其版本列表

module.exports = {
  prodDependencies: {
    "babel-core": "6.26.0"
  },
  devDependencies: {
    "core-js": "2.5.5"
  },
  testDependencies: {
    "jest": "23.5.0"
  }
}