首先,你应该知道你所尝试的不仅很奇怪,而且违背了 NodeJS 中的许多良好实践和模式。
尽管如此,这是可能的,如果做得正确,几乎不会给您或不同平台上的其他开发人员带来任何麻烦。
你可以使用一些有点灵感的东西Meteor http://meteor.com构建流程。让我们从概念上将您的项目分为两个不同的部分:
-
Base:处理项目初始化。
-
Internal原来的项目。
项目结构:
- 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,在项目的根目录中。该包将仅包含构建包文件的依赖项Internal项目。我强烈建议你使用类似的东西Mozilla 的罪犯 https://github.com/mozilla/node-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)。
为了最大程度地减少项目中这种粗暴更改的影响,您可以在 main 中定义package.json
所有的建筑程序postinstall
脚本。它将允许一个简单的npm install
在项目的根目录中内部处理所有这些步骤。
像这样的事情:
包.json
{
[...]
"scripts": {
"postinstall": "node build.js && cd internal/ && npm install",
"start": "node internal/app.js"
}
[...]
}