使用dotnet pack包含所有依赖项

Mar*_*cus 6 nuget .net-core asp.net-core

有没有办法强制dotnet pack包括所有引用的程序集(project.json中的所有依赖项)?

我相信这是相关的:

Ian*_*emp 18

截至 2020 年,还没有官方支持的方法来做到这一点。然而各种人已经想出了实现它的方法,目前最好的方法是安装一个惊人的Teroneko准备的NuGet 包。然后您需要做的就是编辑您的 .csproj 以更新您要标记的所有项目,根据包 READMEPrivateAssets="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)。

  • 谢谢,这太棒了,可能是我的。:D([此处](https://github.com/teroneko/Teronis.DotNet/tree/develop/src/MSBuild/Packaging/ProjectBuildInPackage)您可以找到上面几行的源代码。我决定将其作为[包](https://www.nuget.org/packages/Teronis.MSBuild.Packaging.ProjectBuildInPackage/)也) (3认同)
  • @Teroneko,我不知道你在这里有一个帐户 - 我已经更新了答案以包含你的包裹,并将答案转换为社区维基,这样我就不会得到它的信用(当我第一次发布它时我应该这样做) 。如果您愿意,您可以发布您自己的答案,并附上您的软件包的链接,以便从它所帮助的人那里获得应有的声誉 - 如果您这样做,我将标记此答案以将其删除,以便您的答案成为规范的答案。 (2认同)
  • 这不能与“--no-build”标志(这是 AppVeyor 上的默认行为)结合使用,因为它会由于“DependsOn”而隐式调用(重新)构建。“dotnet pack -c release -o pack --no-build”会产生错误“错误 NETSDK1085:‘NoBuild’属性设置为 true,但调用了‘Build’目标。” (2认同)

gig*_*igi 9

该问题的另一个解决方案是创建一个自定义 .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”功能,无需指定任何参数。


Gle*_*lls 5

我一直在寻找这个答案,当我找不到明显的答案时很生气。最适合我的解决方案是创建一个 nuspec,将我想要在 nupkg 中的 DLL 列表添加到该规范中,然后使用 dotnet pack 构建。我在这里创建了一个简单的示例和自述文件 - nuget 示例应用程序

  • 当我需要对包内部进行更多控制时,这种方法对我有用。请注意,在“.csproj”中的“&lt;PropertyGroup&gt;”中包含“&lt;NuspecFile&gt;./relative/path/to.nuspec&lt;/NuspecFile&gt;”允许我们将“dotnet pack”命令与“.nuspec”文件一起使用。 (2认同)