我有一个由package.json驱动的复杂生产环境。
问题: 我希望在本地安装一些额外的软件包,密切关注它们的列表和版本。
解决方案(如何到达): 指向 npm 使用另一个配置文件,从git中排除,这将保留我的私有依赖项。使用该文件通过 npm install 将软件包添加到本地 node_modules 。所以我真正需要的是改变npm的配置上下文。
我不知道如何指出npm使用不同的配置(类似 gulp -gulpfile )。
从评论中更新 dev-dependencies不是最佳选择。我使用的东西90%的其他开发人员不需要安装在他们的node_modules中(实际上我可以打破他们的环境以一种奇怪的方式更新git-shared核心项目范围内的dev-dependencies 的package.json )。
答案 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中。
您可以使用save
标志将其保存为普通依赖项(在开发和生产中可用)。例如:
npm install <package-name> --save`
您可以使用save-dev
标志将其保存为开发依赖项(仅在开发中可用,而不在生产中)。例如:
npm install <package-name> --save-dev
在服务器上运行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"
}
}