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/文件夹中生成以下文件:
- .csproj.nuget.g.props
- .csproj.nuget.g.targets
这些文件包括从 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>
。
多平台框架似乎破坏了目标文件的性能,我也很好奇为什么会这样。但这是小费。你应该使用它。
我有项目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/文件夹中生成以下文件:
- .csproj.nuget.g.props
- .csproj.nuget.g.targets
这些文件包括从 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>
。
多平台框架似乎破坏了目标文件的性能,我也很好奇为什么会这样。但这是小费。你应该使用它。