【问题标题】:Msbuild v15 can't resolve the variables of metadata of nuspec fileMsbuild v15 无法解析 nuspec 文件元数据的变量
【发布时间】:2018-10-18 19:53:35
【问题描述】:

我知道,自 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 能否支持使用包的元数据变量?

【问题讨论】:

  • 当您运行 msbuild /t:pack 时,MSBuild 会将您的 .csproj 转换为 .nuspec 文件。因此,您不应再使用自己的.nuspec。我认为msbuildnuget 的工作方式不同是有意的。如果你想要某些行为,你可以坚持nuget。当然也可以通过 GitHub github.com/Microsoft/msbuild/issues与微软大佬讨论

标签: c# msbuild nuget nuspec dotnet-sdk


【解决方案1】:

正如 cmets 中提到的,您不再需要 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>

【讨论】:

  • 它就像一个魅力;我认为这个目标应该是 msbuild 的一部分,因为使用 nuspec 的原因有很多。
  • 顺便说一句,如果您缺少经常需要的用例,您也可以在 GitHub 上的 NuGet/Home 上提交问题。目前,有可扩展性目标来添加各种文件(内容文件、库、特定于运行时的资产……)并设置元数据属性,因此 .nuspec 的剩余用例非常少。
  • 这对我没有帮助。当我将值放入 nuspec 时,我才能使构建工作
  • @DonRhummy 我建议您使用可重现的示例创建一个新问题,以查看您遇到的问题。
猜你喜欢
  • 1970-01-01
  • 2018-06-22
  • 2021-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-14
  • 1970-01-01
相关资源
最近更新 更多