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

li9yvcax  于 2023-02-03  发布在  Node.js
关注(0)|答案(5)|浏览(160)

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

**问题:**我想在本地安装一些附加的软件包,请留意它们的列表和版本。
**解决方案(如何实现):**点 npm 使用另一个配置文件,从git中排除,这将保持我的私有依赖项。使用该文件添加包到本地 node_modulesnpm install。所以实际上我需要的是改变npm的配置上下文。

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

从评论更新开发依赖项不是解决之道。我使用的东西90%的其他开发者不需要安装在他们的node_modules中(事实上,我可以用一种奇怪的方式破坏他们的环境,在git共享的核心项目范围 package.json 中更新开发依赖项)。

lbsnaicq

lbsnaicq1#

首先,您应该知道您所尝试的不仅是怪异的,而且还违背了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。然后,在internal/目录中运行npm install

    • 内部版本. 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文件放入存储库忽略文件(例如:忽略)。
为了最大限度地减少项目中这种野蛮更改的影响,您可以在主package.json中定义postinstall脚本中的所有构建例程,这将允许项目根目录中的一个简单npm install在内部处理所有这些步骤。
大概是这样的

    • 包. json**
{
  [...]
  "scripts": {
    "postinstall": "node build.js && cd internal/ && npm install",
    "start": "node internal/app.js"
  }
  [...]
}
vs3odd8k

vs3odd8k2#

npm已经提供了一个内置的特性来处理这一需求。要在开发环境和生产环境中使用不同的依赖项,可以通过两种不同的方式将依赖项保存到package.json中。
1.您可以使用save标志将其另存为普通依赖项(在开发和生产中可用)。例如:

npm install <package-name> --save`

1.您可以使用save-dev标志将其另存为开发依赖项(仅在开发中可用,在生产中不可用)。例如:

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

当您在服务器上运行npm install时,如果NODE_ENV设置为production,它将不会安装dev依赖项。
更多关于它在这里:https://docs.npmjs.com/cli/install。还有一些附加的概念,如可选的依赖关系等,您也可以使用。

4dbbbstv

4dbbbstv3#

您可以使用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时,将安装所有依赖项,但在生产开发环境中,将忽略依赖项
希望对你有帮助:)

kb5ga3dv

kb5ga3dv4#

你可以书写你自己的自觉。
您需要编写package.json生成器,以便生成package.json,其中仅需要依赖项

用途

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

此处将创建package.json文件,其依赖性如package.dependencies.js所述。

实现

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"
  }
}
falq053o

falq053o5#

我有点晚了党,但这将帮助某人。你可以检查以下软件包。https://www.npmjs.com/package/penv
它将允许您创建可在多个环境中使用的环境文件。

相关问题