npm从特定的环境中从GitHub安装

我的团队使用私人npmregistry。 在本地开发和部署到生产环境时,我们会从此私有registry安装软件包。 但是,当部署到分段时,我们希望从GitHub中取而代之。 我认为这可以使用preinstall脚本,如果NODE_ENV = staging,则重写package.json以使用适当的git + ssh:// URLs代替版本号。

这似乎不起作用,可能是因为npm忽略对package.json所做的更改(已经需要它)。

也许我正在以完全错误的方式去解决这个问题。 推荐的方法是什么?

您可以尝试运行npm-install ,它将parsing并安装所有的依赖关系,然后npm-shrinkwrap将生成文件npm-shrinkwrap.json

您可以在npm-shrinkwrap.json上运行您的预安装脚本,并根据需要插入“git + ssh://”URL,该URL已经具有您需要的所有已解决的依赖关系。 这应该给你一个收缩包装的package.json文件,它指向你的github仓库。

查看https://www.npmjs.org/doc/cli/npm-shrinkwrap.html#Building-shrinkwrapped-packages了解更多关于收缩包装的信息。

您可以使用两个不同的package.json文件,一个用于分段,一个用于开发和生产。 这些文件可以存储在相应的SCM分支上。

你可以用很多方式指定npm依赖关系。

Git URL

 { "dependencies": { "private_dependency": git://user@hostname:project.git#ref } } 

只需提供URL的依赖。 #ref是一个git引用。 如果你省略这个,它将默认master

GitHuburl

 { "dependencies": { "private_dependency": user/project } } 

Tarball URL

 { "dependencies": { "private_dependency": example.com/tarball.tar.gz } } 

有关支持格式的更多信息,请参阅此处。

有一个类似于你的设置,我们使用roco来运行各种任务,如旧标签清理,testing运行等。如果configuration正确,它将归结为roco staging deployroco production deploy 🙂

对于私人存储库,你必须把它放在依赖项下。

 { "private": true "name": "foo", "dependencies": { "private-repo": "git+ssh://gitolite@my.server:my/project", } [...] }