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

use npm with different configuration than package.json

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

问题: 我想在本地安装一些额外的包,请留意它们的列表和版本。

解决方案(如何到达那里):npm 使用另一个配置文件,从 git 中排除,这将保留我的私有依赖项。使用该文件通过 npm install 将软件包添加到本地 node_modules。所以实际上我只需要更改 npm 的配置上下文。

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

根据评论更新 开发依赖性不是可行的方法。我使用了 90% 的其他开发人员不需要安装在他们的 node_modules 中的东西(事实上我可以 破坏 他们的环境以一种奇怪的方式更新 git-在项目范围内共享核心 package.json).

npm 已经提供了一个内置功能来准确处理这个要求。要在开发环境和生产环境中拥有不同的依赖项,您可以通过两种不同的方式将依赖项保存到 package.json。

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

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

    npm install <package-name> --save-dev
    

当你在服务器上 运行 npm install 时,如果 NODE_ENV 设置为生产,它不会安装开发依赖。

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

您可以使用 dev dependencies 而不是使用单独的文件。

使用 npm install packageName --dev 安装包,包将进入 package.jsondevDependencies 例如

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

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

希望对您有所帮助:)

首先,你应该知道你的尝试不仅很奇怪,而且违背了 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)

起点是在项目的根目录中为 Base 创建一个 package.json 文件。此包将仅包含构建 Internal 项目的包文件的依赖项。我强烈建议您使用 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"
  }
  [...]
}

你可以写你自己的实现。

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

用法

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

此处将创建 package.json 文件,其依赖项在 package.dependencies.js.

中描述

实现

1.Add package.json 到 .gitignore

2.Create 文件 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.Create package.json.hbs(package.json 无依赖项)

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

4.Create 文件 package.dependencies.js 仅包含包及其版本列表的对象

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