108*_*ams 2 node.js npm package.json npm-install
我有一个由package.json驱动的复杂生产环境.
问题: 我希望在本地安装一些额外的软件包,密切关注它们的列表和版本.
解决方案(如何到达): 指向npm使用另一个配置文件,从git中排除,这将保留我的私有依赖项.使用该文件通过npm install将包添加到本地node_modules.所以我真正需要的是改变npm的配置上下文.
我不知道如何指向npm使用不同的配置(类似于gulp -gulpfile).
从注释更新 dev-dependencies不是要走的路.我使用的东西90%的其他开发人员不需要安装在他们的node_modules中(事实上,我可以以一种奇怪的方式破坏他们的环境,更新git-shared核心项目范围的package.json中的 dev-dependencies ).
首先,你应该知道你所尝试的不仅是奇怪的,而且还反对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)
Run Code Online (Sandbox Code Playgroud)
起点是在项目的根目录中为Base创建一个package.json文件.此包将仅包含构建Internal项目的包文件的依赖项.我强烈建议您使用类似Mozilla的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');
Run Code Online (Sandbox Code Playgroud)
不要忘记将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"
}
[...]
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4562 次 |
| 最近记录: |