我知道自从msbuild 15(vs 2017)发布以来,NuGet现已完全集成到MSBuild中.
我有一个nuspec文件,包含定义包属性的变量,如:
<metadata>
<id>$id$</id>
<version>$version$</version>
<authors>$authors$</authors>
...
</metadata>
nuspec文件位于项目的同一文件夹中.
使用nuget工具创建包时,它工作正常.
nuget pack
使用msbuild v15时,会引发异常.
运行命令:
msbuild -version
Microsoft (R) Build Engine version 15.8.168+ga8fba1ebd7 for .NET Framework
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): error : Value cannot be null or an empty string.
奇怪的是,dotnet sdk版本2.1.402引发了异常.
我尝试使用vs2017安装msbuild及其路径,并且它也引发了相同的异常.
当我用其值替换变量时,msbuild工作正常.
这个问题
这是msbuild版本15.8.168.64424中的错误还是我错过了什么?
换句话说,msbuild可以支持使用包的元数据变量吗?
解决方法:
正如评论中所提到的,您不再需要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>