使用配置不同于 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。
您可以使用 save
标志将其保存为普通依赖项(在开发和生产中可用)。例如:
npm install <package-name> --save`
您可以使用 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.json
的 devDependencies
例如
"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"
}
}
我有一个由 package.json 驱动的复杂生产环境。
问题: 我想在本地安装一些额外的包,请留意它们的列表和版本。
解决方案(如何到达那里): 点 npm 使用另一个配置文件,从 git 中排除,这将保留我的私有依赖项。使用该文件通过 npm install 将软件包添加到本地 node_modules。所以实际上我只需要更改 npm 的配置上下文。
我不知道如何让 npm 使用不同的配置(类似于 gulp -gulpfile)。
根据评论更新 开发依赖性不是可行的方法。我使用了 90% 的其他开发人员不需要安装在他们的 node_modules 中的东西(事实上我可以 破坏 他们的环境以一种奇怪的方式更新 git-在项目范围内共享核心 package.json).
npm
已经提供了一个内置功能来准确处理这个要求。要在开发环境和生产环境中拥有不同的依赖项,您可以通过两种不同的方式将依赖项保存到 package.json。
您可以使用
save
标志将其保存为普通依赖项(在开发和生产中可用)。例如:npm install <package-name> --save`
您可以使用
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.json
的 devDependencies
例如
"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"
}
}