Node.js 使用与package.json配置不同的npm
我有一个由package.json驱动的复杂生产环境 问题: 我希望在本地安装一些额外的软件包,关注它们的列表和版本 解决方案(如何到达那里): 指向npm使用另一个配置文件,从git中排除,它将保留我的私有依赖项。使用该文件将包添加到带有npm安装的本地节点_模块。所以实际上我所需要的就是更改npm的配置上下文 我不知道如何指示npm使用不同的配置(比如gulp-gulpfile)Node.js 使用与package.json配置不同的npm,node.js,npm,package.json,npm-install,Node.js,Npm,Package.json,Npm Install,我有一个由package.json驱动的复杂生产环境 问题: 我希望在本地安装一些额外的软件包,关注它们的列表和版本 解决方案(如何到达那里): 指向npm使用另一个配置文件,从git中排除,它将保留我的私有依赖项。使用该文件将包添加到带有npm安装的本地节点_模块。所以实际上我所需要的就是更改npm的配置上下文 我不知道如何指示npm使用不同的配置(比如gulp-gulpfile) 从评论更新开发依赖项不是一条路要走。我使用stuff 90%的其他开发人员不需要安装在他们的node_模块中(事
从评论更新开发依赖项不是一条路要走。我使用stuff 90%的其他开发人员不需要安装在他们的node_模块中(事实上,我可以用一种奇怪的方式打破他们的环境,更新git shared core project wide package.json中的开发依赖项)。
npm
已经提供了一种内置功能来准确处理这一需求。要在开发环境和生产环境中具有不同的依赖关系,可以通过两种不同的方式将依赖关系保存到package.json中
save
标志将其保存为普通依赖项(可在开发和生产中使用)。例:
npm install <package-name> --save`
npm install <package-name> --save-dev
更多信息请点击此处:。您还可以使用其他概念,如可选依赖项等。您可以使用
开发依赖项
而不是使用seprate文件
使用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时,所有依赖项都将被安装,但在生产环境中,开发依赖项将被忽略
希望它能有所帮助:)首先,你应该知道,你所尝试的不仅仅是怪异的行为,而且与NodeJS中的许多良好实践和模式背道而驰
然而,这是可能的,如果做得好,几乎不会给您或其他不同平台的开发人员带来任何麻烦
您可以在构建流程中使用一些受启发的东西。让我们从概念上将项目分为两个不同的部分:
- 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)
起点是在项目根目录中创建一个package.json
文件到Base。此包将仅包含构建内部项目的包文件的依赖项。我强烈建议您使用类似的方法来确保使用ENVs正确完成配置。这里的目标是在运行时编写另一个package.json
文件
我们还假设在您的环境中有一个环境变量USE\u MODULES=“true”
。您可以在Base项目中使用这一事实来定义要使用build.js文件安装哪些模块。您可以在运行时读取和编辑它。准备好后,将其另存为internal/package.json
。然后,在internal/
目录中运行npm install
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
文件放在存储库忽略文件(例如:gitinore)中
为了最大限度地减少项目中这种粗暴更改的影响,您可以在mainpackage.json
中定义postinstall
脚本中的所有构建例程。它将允许在项目根目录中安装一个简单的npm
,在内部处理所有这些步骤
大概是这样的:
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.将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('+'));
4.创建仅包含包及其版本列表的文件package.dependencies.js对象
module.exports = {
prodDependencies: {
"babel-core": "6.26.0"
},
devDependencies: {
"core-js": "2.5.5"
},
testDependencies: {
"jest": "23.5.0"
}
}
快速怀疑-您想这样做以保持本地包的私密性吗?还是为了防止它们被安装在生产中?为了保持它们的私密性。我测试了很多与工具链相关的东西,我需要检查一个包,将它与我的定制gulpfile一起用于实际应用程序,并提供反馈。它可能会,也可能不会最终进入生产和软件包。json不幸的是,这不是解决方案:我不想通过git与我的团队的其他成员共享依赖关系,我不需要用我需要和使用的软件包更改他们的节点模块。他们甚至不需要知道有人在玩这个工具链或者在向它添加什么(90%的人不使用我做的东西,尽管他们都依赖于package.json中的开发依赖项)
module.exports = {
prodDependencies: {
"babel-core": "6.26.0"
},
devDependencies: {
"core-js": "2.5.5"
},
testDependencies: {
"jest": "23.5.0"
}
}