如果此npm软件包的版本比npm注册表中的版本新,则Auzre管道仅发布npm软件包

时间:2018-09-27 13:40:02

标签: npm azure-devops azure-pipelines

在Azure DevOps Services for npm的快速入门指南中,它在最后的第6步:发布npm程序包中指出:

“如果您将npmjs.com配置为上游,并且程序包名称/版本存在于公共注册表中,那么您将被禁止发布”

换句话说,一旦开始使用Azure管道进行构建,并且您希望它构建一个程序包,则只有在使用程序包版本(不存在)时,它才会构建一个程序包。 。

但是,尝试这样做将导致警告,导致橙色/黄色构建状态。

是否可以检查软件包版本是否已更新,以便仅在软件包版本实际包含新版本的情况下,构建才尝试构建软件包?还是在这里推荐另一种方法?

2 个答案:

答案 0 :(得分:2)

这里有三个步骤:

  1. 获取本地软件包版本(如果遇到新版本,则为新版本)
  2. 获取发布的软件包版本
  3. 仅在新版本和发布版本不匹配时发布
  - script: |
      PackageName=$(npm list --json --depth=0 | sed -n 2p | cut -d '"' -f4)
      NewPackageVersion=$(npm list --json --depth=0 | sed -n 3p | cut -d '"' -f4)
      PublishedPackageVersion=$(npm show $PackageName version)
      echo "##vso[task.setvariable variable=NewPackageVersion;]$NewPackageVersion"
      echo "##vso[task.setvariable variable=PublishedPackageVersion;]$PublishedPackageVersion"
    displayName: "Extract package versions"

  - task: Npm@1
    inputs:
      command: publish
    displayName: "Publish"
    condition: |
      and(
        ne(variables['NewPackageVersion'], variables['PublishedPackageVersion']), 
        succeeded(), 
        eq(variables['Build.SourceBranch'], 'refs/heads/master')
      )

答案 1 :(得分:0)

此行为是预期的,因为它不支持公共注册表中存在的覆盖包。

  

是否可以检查软件包版本是否已更新,以便   如果该软件包的版本,则该构建仅尝试构建一个软件包   实际包含一个新版本?

从理论上讲应该有可能,您可以尝试编写一个脚本来首先检查该脚本,如果特定版本在公共注册表中不存在,则进行构建和发布,否则停止构建。但是,如果要比较的数据量很大,则将花费大量时间来构建...甚至遇到超时问题...