在私有NPM中使用SNAPSHOT,就像在Maven中一样

时间:2015-07-01 08:52:56

标签: maven npm snapshot

我有一个非常简单的工作设置:

Lib A                                             Lib B
publish 1.0.0-SNAPSHOT  ->  Private Registry  ->  npm install

请记住,A和B在不同的机器上(想想jenkins群集!)。

在两个版本中,版本以" -SNAPSHOT"结束。并在每个版本(A)上更新。当然,依赖的库(B,...)应该始终使用注册表中的最新版本。 问题是,NPM不会重新获取相同的版本。

Lib A                                           Lib B
small change, rebuild:
publish 1.0.0-SNAPSHOT  ->  Private Registry  !!  npm install -f
                                                  npm cache clean
                                              !!  npm install -f
                                                  rm -rf node_modules
                                              ->  npm install

想法:全局禁用NPM的缓存

那没关系,因为我们是本地的npm代理: "〜/ .npmrc":

force=true
cache-min=0
cache-max=0

但这确实工作!只删除node_modules目录才有效。这不是一个有用的解决方案,因为开发人员不需要使用" rm -rf node_modules&& npm install"。

使用maven这个设置有效,因为我们使用" -U"选项。这会强制maven检查更新的SNAPSHOT版本是否可用。 NPM不理解SNAPSHOT的概念,但至少每次都应该询问注册表。

npm版本2.12.0

私人注册:Sonatype Nexus™2.10.0-02

1 个答案:

答案 0 :(得分:19)

创意1

如果你"虐待"你可以模仿这种行为。 SemVer的预发布部分。我已成功使用以下策略:

使用-SNAPSHOT发布模块,但每次发布(-SNAPSHOT.#-SNAPSHOT-#)时附加一个递增的数字。

例如:"x.x.x-SNAPSHOT.1"第一次发布,然后"x.x.x-SNAPSHOT.2"第二次发布,依此类推。

确保使用一致的模式。所以,例如,如果你使用点,坚持点,或者如果你使用破折号,坚持使用破折号。

对于依赖模块,您只需要将版本声明为

"^x.x.x-SNAPSHOT"

和NPM将获取最新版本。

由于两个原因,所有这些都有效

  1. SemVer以下列方式处理预发布1.0.0-SNAPSHOT < 1.0.0-SNAPSHOT.1 < 1.0.0-SNAPSHOT.2 < 1.0.0-SNAPSHOT.3 ...
  2. NPM将始终检索最新的预发布版本
  3. 警告:这只适用于修补程序版本。从技术上讲,1.2.x-SNAPSHOT大于1.1.x-SNAPSHOT,但SemVer在使用预发布时不考虑这一点。

    来自文档:

      

    如果版本具有预发布标记(例如,1.2.3-alpha.3),那么它   如果至少有一个,则只允许满足比较器组   具有相同[major,minor,patch]元组的比较器也有一个   预发布标签。

         

    例如,范围&gt; 1.2.3-alpha.3将被允许匹配   版本1.2.3-alpha.7,但3.4.5-alpha.9不满足,   即使3.4.5-alpha.9在技术上&#34;大于&#34; 1.2.3-alpha.3   根据SemVer排序规则。版本范围仅接受   1.2.3版本上的预发布标签。版本3.4.5将满足   范围,因为它没有预发布标志,而3.4.5是   大于1.2.3-alpha.7。

    创意2 再次,这是另一个&#34; hack&#34;。如果您对丢失SemVer的补丁部分感到满意​​,可以将版本发布为

    x.x.<unix epoch ms>

    unix时代不断增加(至少到2038年为32位),每次发布时,你都会发布一个更大的版本。