Msbuild pack 忽略带有目标和任务的 nuget 包

Msbuild pack ignores nuget packages with targets and task

我有项目A和项目B

项目A

是一个带有输出和 exe 文件的 dotnet 标准项目,用作工具。 这会在构建时生成一个 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/文件夹中生成以下文件:

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

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

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

有人对我遗漏的内容或可能是个问题有任何建议吗?

如果您使用 *.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

改为修改项目 B.csproj 文件:

使用 <TargetFramework>net461</TargetFramework> 而不是 <TargetFrameworks>net461</TargetFrameworks>

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