我们有一个涉及多个 Node 模块的大型项目。我们的发展模式分为 3 个级别。
- 开发
- 阶段
- 生产
我们希望将带有开发、阶段和生产标签的模块发布到我们的私有(private)注册表,并期望 CI 工具基于这些标签构建和安装 deps。
现在,要部署到开发环境,CI 只需在父模块上执行 npm install 即可,然后安装最新版本的所有 deps。这里不用担心。
但是,如果 CI 想要将某些内容推送到阶段/生产环境,我如何告诉 npm install 选择标记为阶段/生产的依赖项版本>.
我知道如果我想安装特定版本的依赖项,我可以指定npm install package@version。但由于我们有大量的依赖项,这种方法对我们来说不可行。
我们也愿意接受改变我们的开发模式的建议。任何帮助将不胜感激。
最佳答案
一种方法是将每个环境的版本存储在单独的 package.json 中。
例如,您可以有一个/packages 目录,其中包含 3 个文件 dev.package.json、stage.package.json、prod.package.json。
让您的 CI 进程为其安装环境复制正确的 package.json。
我不确定 CI 过程是什么样的,所以我将给出一个使用 shell 脚本的示例,即适用于 Linux 的部署.sh。
#!/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 来获取它们。
关于javascript - 如何安装所有 npm 依赖项的特定版本/标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43439053/