Mar*_*cus 6 nuget .net-core asp.net-core
有没有办法强制dotnet pack包括所有引用的程序集(project.json中的所有依赖项)?
我相信这是相关的:
Ian*_*emp 18
截至 2020 年,还没有官方支持的方法来做到这一点。然而各种人已经想出了实现它的方法,目前最好的方法是安装一个惊人的Teroneko准备的NuGet 包。然后您需要做的就是编辑您的 .csproj 以更新您要标记的所有项目,根据包 README。PrivateAssets="all"
如果您无法安装上述 NuGet 包,您可以通过编辑.csproj包含以下内容来实现相同的效果(再次,这是 Teroneko 发现的 - 这本质上是他创建的 NuGet 包所做的):
<Project>
<PropertyGroup>
<TargetsForTfmSpecificBuildOutput>$(TargetsForTfmSpecificBuildOutput);CopyProjectReferencesToPackage</TargetsForTfmSpecificBuildOutput>
</PropertyGroup>
<Target Name="CopyProjectReferencesToPackage" DependsOnTargets="BuildOnlySettings;ResolveReferences">
<ItemGroup>
<!-- Filter out unnecessary files -->
<_ReferenceCopyLocalPaths Include="@(ReferenceCopyLocalPaths->WithMetadataValue('ReferenceSourceTarget', 'ProjectReference')->WithMetadataValue('PrivateAssets', 'All'))"/>
</ItemGroup>
<!-- Print batches for debug purposes -->
<Message Text="Batch for .nupkg: ReferenceCopyLocalPaths = @(_ReferenceCopyLocalPaths), ReferenceCopyLocalPaths.DestinationSubDirectory = %(_ReferenceCopyLocalPaths.DestinationSubDirectory) Filename = %(_ReferenceCopyLocalPaths.Filename) Extension = %(_ReferenceCopyLocalPaths.Extension)" Importance="High" Condition="'@(_ReferenceCopyLocalPaths)' != ''" />
<ItemGroup>
<!-- Add file to package with consideration of sub folder. If empty, the root folder is chosen. -->
<BuildOutputInPackage Include="@(_ReferenceCopyLocalPaths)" TargetPath="%(_ReferenceCopyLocalPaths.DestinationSubDirectory)"/>
</ItemGroup>
</Target>
</Project>
Run Code Online (Sandbox Code Playgroud)
与包一样,您然后用 标记 .csproj 中依赖的项目引用PrivateAssets="all",并且它 Just Works(tm)。
该问题的另一个解决方案是创建一个自定义 .targets 文件以包含在您的项目中。您可以添加一些 msbuild 指令以将所需的文件包含在包中。这里有一些关于如何执行此操作的文档,这里是一个简短的示例
<PropertyGroup Condition="$(PackAsComponent) != ''">
<TargetsForTfmSpecificBuildOutput>$(TargetsForTfmSpecificBuildOutput);CustomBuildOutput</TargetsForTfmSpecificBuildOutput>
<TargetsForTfmSpecificContentInPackage>$(TargetsForTfmSpecificContentInPackage);CustomContentInPackage</TargetsForTfmSpecificContentInPackage>
</PropertyGroup>
<Target Name="CustomBuildOutput">
<ItemGroup>
<BuildOutputInPackage Include="$(OutputPath)*.dll" Exclude="$(TargetPath)" />
<BuildOutputInPackage Include="$(OutputPath)*.pdb" />
<BuildOutputInPackage Include="$(OutputPath)*.exe" Exclude="$(TargetPath)" />
</ItemGroup>
</Target>
<Target Name="CustomContentInPackage">
<ItemGroup>
<TfmSpecificPackageFile Include="abc.txt">
<PackagePath>mycontent/$(TargetFramework)</PackagePath>
</TfmSpecificPackageFile>
</ItemGroup>
</Target>
Run Code Online (Sandbox Code Playgroud)
基本上,当我在项目中设置 PackAsComponent 属性时,我会激活此功能。这可以 100% 保留“dotnet pack”功能,无需指定任何参数。
我一直在寻找这个答案,当我找不到明显的答案时很生气。最适合我的解决方案是创建一个 nuspec,将我想要在 nupkg 中的 DLL 列表添加到该规范中,然后使用 dotnet pack 构建。我在这里创建了一个简单的示例和自述文件 - nuget 示例应用程序
| 归档时间: |
|
| 查看次数: |
3538 次 |
| 最近记录: |