网上关于此的类似讨论很少,但都是旧的,没有“从头到尾”复杂的解决方案,只有很少的具体问题。
我想将多个项目打包在一个包中,但我不能,因为自 2016 年以来 Microsoft 完全忽略了这个问题。
不再推荐使用
nuget pack
,但它有 -IncludeReferencedProjects
标志。所以我想用 dotnet pack
命令来做到这一点。
https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-pack
以下是关于此问题的长篇文章(470 条评论): https://github.com/NuGet/Home/issues/3891 或者只是一些其他讨论: 使用 dotnet pack 打包多个程序集
但是你能告诉我如何简单地打包我的主项目和.csproj文件中包含的所有项目吗(
<PackageReference Include="">
)?
花了几天时间我可以解决所有问题:
.csproj
,那么唯一的方法就是创建多个包。dotnet pack
结果(.nupkg
文件放入其中)这个文件夹)。my.package.1.0.0-dev.nupkg
),则必须使用 dotnet nuget locals all --clear
。否则,即使在将“更新”版本安装到您的项目/解决方案后,它仍然会从缓存中获取旧版本。otherProject.dll
。要检查它,只需复制粘贴您的 .nupkg
,将文件扩展名更改为 .zip
,打开它,转到 lib/net<your-version>
并检查是否有您所有的 .dll。所以如果你有主项目和 5 个 <PackageReferences> to your local projects, you need to have 5+1
.dll`.现在我们来解决主要问题,如何将多个项目打包到一个包中:
pack.props
文件(最好是在主项目中),位于 main-project.csproj 下方。或者,如果您想在全球范围内使用它,请在您的解决方案中创建它:复制粘贴此代码,不要更改它:
<Project>
<PropertyGroup>
<TargetsForTfmSpecificBuildOutput>$(TargetsForTfmSpecificBuildOutput);CopyProjectReferencesToPackage</TargetsForTfmSpecificBuildOutput>
</PropertyGroup>
<Target Name="CopyProjectReferencesToPackage" DependsOnTargets="ResolveReferences">
<ItemGroup>
<BuildOutputInPackage Include="@(ReferenceCopyLocalPaths->WithMetadataValue('ReferenceSourceTarget', 'ProjectReference')->WithMetadataValue('PrivateAssets', 'All'))" />
</ItemGroup>
</Target>
</Project>
修改你的
.csproj
(根据自己调整):
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="pack.props" />
<PropertyGroup>
<Nullable>warnings</Nullable>
<TargetFramework>net8.0</TargetFramework>
<NeutralLanguage>en-US</NeutralLanguage>
<Description>My Description</Description>
<Authors>My Authors</Authors>
<TargetsForTfmSpecificBuildOutput>$(TargetsForTfmSpecificBuildOutput);CopyProjectReferencesToPackage</TargetsForTfmSpecificBuildOutput>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\MyProject\MyProject.csproj" PrivateAssets="All" />
</ItemGroup>
</Project>
.nuspec
文件:dotnet pack -p:NuspecFile=MyFile.Bundled.nuspec -o nupkgs