我有一个项目,其中包含三个针对各种.net版本(mylib.net20.csproj
,mylib.net40.csproj
和mylib.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文件。
答案 0 :(得分:1)
creating a package can be done two ways
第一种情况非常简单,其中将考虑在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文件并检查...)