使用NuSpec $ version $替换预发布包的奇怪行为

时间:2013-11-29 22:39:35

标签: teamcity nuget

我有一个由核心nuget包组成的项目,然后是几个额外的扩展包。

核心软件包有一个如下所示的nuspec:

<?xml version="1.0"?>
<package>
  <metadata>
    <id>$id$</id>
    <version>$version$</version>
    <title>The Core Package</title>
    <authors>$author$</authors>
    <owners>$author$</owners>    
    <description>$description$</description>
  </metadata>
</package>

而且,在每个扩展包中,我都有这样的nuspec:

<?xml version="1.0"?>
<package>
  <metadata>
    <id>$id$</id>
    <version>$version$</version>
    <title>A Extension Package</title>
    <authors>$author$</authors>
    <owners>$author$</owners>
    <dependencies>
      <dependency id="The.Core" version="$version$"/>
    </dependencies>
  </metadata>
</package>

在运行发布版本时,我使用相同的$ version $令牌一次性修改所有包。这使得每当我发布时,对核心的依赖性都会向前发展。

现在,我一直在私人nuget Feed上使用它,它一直很好用。但是,我想将这些软件包作为预发布版本发布到public nuget。我在所有程序集上设置了Assembly Version属性:

[assembly: AssemblyFileVersion("1.0.1")]
[assembly: AssemblyInformationalVersion("1.0.1-alpha")]

然而,当我运行nuget pack(来自我的构建服务器)时,它似乎没有获得1.0.1-alpha作为软件包的版本:

[pack] Starting NuGet.exe 2.7.40906.75 from C:\TeamCity\buildAgent\tools\NuGet.CommandLine.DEFAULT.nupkg\tools\NuGet.exe
[14:21:46][pack] WARNING: Option 'Verbose' has been deprecated. Use 'Verbosity' instead.
[14:21:46][pack] Attempting to build package from 'The.Core.csproj'.
[14:21:46][pack] Packing files from 'C:\TeamCity\buildAgent\work\857bd09f14af8e44\src\The.Core\bin\Release'.
[14:21:46][pack] Using 'The.Core.nuspec' for metadata.
[14:21:46][pack] 
[14:21:46][pack] Id: The.Core
[14:21:46][pack] Version: 1.0.1
[14:21:46][pack] Authors: Jonathan  Holland
[14:21:46][pack] License Url: http://www.apache.org/licenses/LICENSE-2.0
[14:21:46][pack] Dependencies: None
[14:21:46][pack] 
[14:21:46][pack] Added file 'lib\net40\The.Core.dll'.
[14:21:46][pack] 
[14:21:46][pack] Successfully created package 'C:\TeamCity\buildAgent\work\Publish\The.Core.1.0.1.nupkg'.
[14:21:46][pack] Process exited with code 0

你可以看到它获得1.0.1作为版本,而不是像我期望的那样获得1.0.1-alpha。

当构建服务器尝试打包第一个扩展时,事情变得更加棘手:

[pack] Starting NuGet.exe 2.7.40906.75 from C:\TeamCity\buildAgent\tools\NuGet.CommandLine.DEFAULT.nupkg\tools\NuGet.exe
[14:21:46][pack] WARNING: Option 'Verbose' has been deprecated. Use 'Verbosity' instead.
[14:21:46][pack] Attempting to build package from 'The.Core.Extension.csproj'.
[14:21:46][pack] Packing files from 'C:\TeamCity\buildAgent\work\857bd09f14af8e44\src\he.Core.Extension\bin\Release'.
[14:21:46][pack] Using 'The.Core.Extension.nuspec' for metadata.
[14:21:46][pack] Found packages.config. Using packages listed as dependencies
[14:21:46][pack] A stable release of a package should not have on a prerelease dependency. Either modify the version spec of dependency "The.Core (ò 1.0.1-alpha)" or update the version field.
[14:21:46][pack] Process exited with code 1

所以,这里我们有一个失败,因为nuspec的dependancy部分中的$ version $已正确替换为&#34; 1.0.1-alpha&#34;但是在版本节点中,它被替换为1.0。 1。

这是非常奇怪的行为,所以我必须做一些完全错误的事情。我认为这是nuspecs的简单搜索和替换令牌,但必须有一些上下文来表示令牌行为的工作方式。

我想要&lt;版本&gt;两个nuspecs上的节点都使用AssemblyInformationalVersion中的版本,它们应该从文档中可以看出。

2 个答案:

答案 0 :(得分:1)

经过大量的探索后,我发现问题来自TeamCity Nuget Build Runner:

enter image description here

此框中填充了%build_number%,并且这与nugets自己对装配属性的反射有所冲突。

将其设置为空白修复它。

答案 1 :(得分:0)

我正在尝试做同样的事情并且表现得非常奇怪。

替换令牌$ version $在<version></version>标记内被正确替换,但在任何依赖项中都没有

<dependency id="Norse.Core.Exceptions" version="$version$" />

最终像

<dependency id="Norse.Core.Exceptions" version="1.0.0" />

我添加了一个新的Build Feature,File Content Replacer并按如下方式进行设置,

处理文件列表: ** / *。nuspec * .nuspec

找到:\ $ version \ $

替换为:%system.build.version%

system.build.version是我之前在此过程中定义的参数,您可以将其设置为您喜欢的任何内容。

希望它有所帮助。

由于

史蒂夫