我们有一个涉及多个节点模块的大型项目。我们的开发模型有3个级别。
我们希望将模块发布到包含开发,阶段和生产标签的私有注册表中,并期望CI工具基于这些标记构建和安装deps。
现在部署到开发环境 CI可以在父模块上执行 npm install ,并安装所有具有最新版本的deps。不用担心。
但是,如果CI希望将某些内容推送到阶段/生产环境,我如何告诉 npm install 选择标记为 stage / production
我知道是否要安装特定版本的依赖项,我可以指定 npm install package @ version 。但由于我们拥有非常多的依赖项,因此这种方法对我们来说是不可行的。
我们也欢迎改变我们的发展模式的建议。任何帮助将不胜感激。
答案 0 :(得分:1)
执行此操作的一种方法是将版本存储在单独的package.json中以用于每个环境。
例如,你可以在/ packages目录中包含3个文件dev.package.json,stage.package.json,prod.package.json。
让CI进程为正在安装的环境复制正确的package.json。
我不确定CI流程是什么样的,所以我给出一个使用shell脚本的例子,deploy.sh for linux。
#!/bin/bash
ENV='production'
if [[ `hostname` =~ \.development\. ]]; then
ENV='development'
fi
if [[ `hostname` =~ \.stage\. ]]; then
ENV='stage'
fi
echo "$ENV environment detected"
cp packages/$ENV.package.json package.json
npm install
这假设服务器的主机名可以帮助指示环境,CI可以运行shell脚本。根据您的设置,您可能需要不同的东西。
例如,您可能已经知道在没有主机名检查部分的CI过程中使用的env,但我添加它以防万一。
使用这种类型的解决方案,您可以让每个env package.json指定环境所需的确切模块版本,并使用npm install来获取它们。