如何在定位多个项目文件时同步nuget包的版本号

时间:2015-07-06 22:45:04

标签: versioning nuget-spec

我有一个项目,其中包含三个针对各种.net版本(mylib.net20.csprojmylib.net40.csprojmylib.net40-client.csproj)的项目文件。我有一个名为mylib.nuspec的nuspec文件,用于将它们打包在一起。

查看nuspec文件的files部分可能会有所帮助,所以这里是:

<files>
    <file src="bin\net20\*.dll" target="lib\net20\" />
    <file src="bin\net40-client\*.dll" target="lib\net40-client\" />
    <file src="bin\net40\*.dll" target="lib\net40\" />
</files>

现在我在nuspec文件中使用静态版本号,我可以通过运行nuget pack mylib.nuspec成功打包所有内容。但是,我想开始使用$version$,所以我不必记得在两个地方更新版本号。

如果我只是将版本号更改为$version$,并以相同的方式构建,我会收到可预测的错误:

Attempting to build package from 'mylib.nuspec'.
The replacement token 'version' has no value.

如果我使用$version$并使用nuget pack mylib.net40.csproj打包,则成功,但我得到的包完全忽略了nuspec文件。

问:如何才能使$version$变量生效?

从技术上讲,我可以将我的nuspec文件重命名为mylib.net20.nuspec,然后使用nuget pack mylib.net20.nuspec打包。我真的不想以这种方式重命名我的nuspec文件。

1 个答案:

答案 0 :(得分:1)

creating a package can be done two ways
  1. 直接使用nuspec
  2. 使用您的csproj文件,该文件实际上在运行时使用您的nuspec文件。
  3. 第一种情况非常简单,其中将考虑在nuspec文件中定义的所有元数据用于创建包。

    nuget pack nuspecfilename.nuspec
    

    执行上述命令时,nuspec文件中的所有硬编码值都将用于创建包

    上述程序直接使用nuspec文件。

    现在让我们来看看你的nuspec文件中使用token $ version $。

    为了使用令牌而不是硬编码值,我们需要在运行nuget pack命令时使用csproj文件。

    nuget pack nameofyourprojectfile.csproj -p "configuration=Release;platform=x64"
    

    我将解释我使用的命令,生成包时使用csproj文件的概念是它将在运行时替换nuspec文件中的所有标记。

    您对csproj文件的相应汇编信息文件将包含将在运行时替换的所需版本元数据。

    -p是在运行时使用的参数,这里我假设我的proj文件是在发行版和x64平台上构建的,所以我在运行时传递了它,因此nuget可以相应地捆绑工件。

    请参阅Here,了解有关如何从csproj创建nuget包的更多详细信息。

    但理想情况下,当您从csproj文件打包时,您的nuspec文件将在运行时使用,因此技术上nuspec文件应该与您的csproj文件具有相同的名称。

    因此单个nuspec文件可能无法实现处理具有不同框架工作的多个项目文件的要求。你需要有相应的nuspec来实现这一点。

    但是如果你仍然希望坚持使用相同的nuspec文件而不重命名或对其进行更改。

    我建议在运行时传递版本

    nuget pack nameofnuspec.nuspec -v 1.3.4.5
    

    -v - 是版本,或者您可以使用-version,然后使用您选择的版本。

    运行上面的命令后,将使用指定的版本创建nuget包。

    检查创建的nuget包,将其重命名为.zip文件并检查...)