我知道自从msbuild 15(相对于2017年)发布以来,NuGet现在已完全集成到MSBuild中。
我有一个nuspec文件,其中定义了包属性的变量,例如:
<metadata>
<id>$id$</id>
<version>$version$</version>
<authors>$authors$</authors>
...
</metadata>
nuspec文件位于项目的同一文件夹中。
使用nuget工具创建软件包时,它可以正常工作。
nuget pack
使用msbuild v15时,它会引发异常。
运行命令:
msbuild -version
.NET Framework的Microsoft(R)Build Engine版本15.8.168 + ga8fba1ebd7 15.8.168.64424
msbuild /t:pack /p:configuration=release /p:NuspecFile=mylib.nuspec
引发例外:
C:\ Program Files \ dotnet \ sdk \ 2.1.402 \ Sdks \ NuGet.Build.Tasks.Pack \ build \ NuGet.Build.Tasks.Pack.targets(199,5):错误:值不能为空或一个空字符串。
奇怪的是,dotnet sdk版本2.1.402引发了异常。
我尝试了随vs2017一起安装的msbuild及其路径,并且它引发了相同的异常。
当我用变量的值替换变量时,msbuild运行正常。
问题
这是msbuild 15.8.168.64424中的错误还是我错过了什么?
换句话说,msbuild可以使用包的元数据变量来支持吗?
答案 0 :(得分:7)
正如评论中提到的那样,您不再需要Nuspec文件,因为可以通过csproj文件中的属性或项上的其他元数据来控制大多数方面(例如,如果您需要其他内容)。
如果由于某种原因确实需要nuspec文件,则需要自己提供用于替换的变量。您可以在csproj文件中的目标中执行以下操作:
<Target Name="SetNuspecProperties" BeforeTargets="GenerateNuspec">
<PropertyGroup>
<NuspecProperties>$(NuspecProperties);id=$(AssemblyName)</NuspecProperties>
<NuspecProperties>$(NuspecProperties);config=$(Configuration)</NuspecProperties>
<NuspecProperties>$(NuspecProperties);version=$(PackageVersion)</NuspecProperties>
<NuspecProperties>$(NuspecProperties);description=$(Description)</NuspecProperties>
<NuspecProperties>$(NuspecProperties);authors=$(Authors)</NuspecProperties>
</PropertyGroup>
</Target>