【问题标题】:Msbuild pack ignores nuget packages with targets and taskMsbuild pack 忽略带有目标和任务的 nuget 包
【发布时间】:2021-04-11 07:02:55
【问题描述】:

我有 ProjectA 和 ProjectB

项目A

是一个 dotnet 标准项目,带有输出和 exe 文件用作工具。 这会在构建时生成一个 nuget 包,使用属性和属性将包标记为工具。 它还被标记为从安装 nuget 包的项目中自动排除,当它们也生成 nuget 包时。

<Project Sdk="Microsoft.Net.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <AssemblyName>ProjectA</AssemblyName>
    <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
    <IsTool>true</IsTool>
    <DevelopmentDependency>true</DevelopmentDependency>
  </PropertyGroup>

   <ItemGroup>
      <None Include="build\ProjectA.props" Pack="True" PackagePath="build" />
      <None Include="build\net461\ProjectA.targets" Pack="True" PackagePath="build" />
    </ItemGroup>
  <PropertyGroup>
</Project>

ProjectA.targets

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <GetPackageVersionDependsOn>MyCustomTask;$(GetPackageVersionDependsOn)</GetPackageVersionDependsOn>
    <MSBuildAllProjects>$(MSBuildAllProjects);$(MSBuildThisFileFullPath)</MSBuildAllProjects>
  </PropertyGroup>

  <Target Name="MyCustomTask">
    <!-- Idealy i would use a custom task to set PackageVersion to something different. Like 5.0.99-alpha1+102435 -->
    <PropertyGroup>
      <PackageVersion>5.0.99-alpha1+102435</PackageVersion>
    </PropertyGroup>
  </Target>
</Project>

项目B

安装对 ProjectA 创建的 nuget 包的引用。

<PropertyGroup>
  <TargetFrameworks>net461</TargetFrameworks>
  <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
</PropertyGroup>
<ItemGroup>
  <PackageReference Include="ProjectA" Version="1.0.0" PrivateAssets="all" />
</ItemGroup>

在构建 ProjectB 时,在 obj/ 文件夹中会生成以下文件:

  • .csproj.nuget.g.props
  • .csproj.nuget.g.targets

这些文件包括从 nuget 包缓存导入到 ProjectA 目标和道具: %userprofile%.nuget\projecta\1.0.0\build\ProjectA.targets 等

Msbuild -t:pack 在运行时会忽略这些导入,因此构建 ProjectB 永远不会像我预期的那样将 PackageVersion 设置为 5.0.99-alpha1+102435。

将上述ProjectA.targets的内容直接添加到ProjectB.csproj中即可。

任何人有任何建议我缺少什么或者这可能是一个问题?

【问题讨论】:

    标签: visual-studio .net-core msbuild nuget


    【解决方案1】:

    如果您使用*.targets 将 nuget 项目打包到基于该文件的 nuget 包中,则应将该文件与 csproj 文件一起识别。

    根据描述,您似乎使用该目标文件将您的 nuget 项目打包成一个版本 5.0.99

    所以你应该让你的csproj 像这样与那个文件一起工作:

    <Project Sdk="Microsoft.NET.Sdk">
      <PropertyGroup>
        <TargetFramework>netcoreapp3.1</TargetFramework>
      </PropertyGroup>
        
        <!--the path of the *.targets file-->
        <Import Project="xxx\xxx.targets"/>
    </Project>
    

    更新 1

    clean nuget caches或删除C:\Users\xxx\.nuget\packages)和msbuild -t:pack ProjectB.csproj下的所有文件查看。

    更新 1

    改为修改 Project B.csproj 文件:

    使用&lt;TargetFramework&gt;net461&lt;/TargetFramework&gt; 而不是&lt;TargetFrameworks&gt;net461&lt;/TargetFrameworks&gt;

    多平台框架似乎破坏了目标文件的性能,我也很好奇为什么会这样。但这是提示。你应该使用它。

    【讨论】:

    • 我更新了我的问题,以更好地调整我的设置,这应该澄清我在生成 nuget 包时没有问题。而是扩展 msbuild -t:pack 目标以在打包期间设置自定义属性。
    • 你是否先清理了nuget缓存(删除C:\Users\xxx\.nuget\packages下的所有文件)然后运行msbuild -t:pack ProjectB.csproj?如果您有以前的旧 nuget,它将始终使用旧的而不是新的。
    • 另外,在清理nuget缓存时,请同时删除项目B的binobj文件夹,然后重新测试。在我身边,有你所有的详细信息,我总是得到 5.0.99-alpha1+102435 的版本 Project B
    • 你有更新吗?我已经更新了我的答案,你可以检查一下。
    • @Rasmus-E,问题是你应该使用&lt;TargetFramework&gt;net461&lt;/TargetFramework&gt; 而不是&lt;TargetFrameworks&gt;net461&lt;/TargetFrameworks&gt;。多平台框架似乎破坏了目标文件的性能,我也很好奇为什么会这样。但这是提示。你应该使用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-19
    • 1970-01-01
    • 1970-01-01
    • 2019-03-20
    • 2015-06-21
    • 1970-01-01
    相关资源
    最近更新 更多