如何从.NET Core csproj中引用的NuGet包中将文件复制到输出目录?

Cia*_*tic 9 msbuild csproj .net-core

我正在尝试在.NET核心csproj应用程序中使用PhantomJS NuGet包.但我认为使用PackageReferenceNuGet的新语法是不可能的.

当我像这样引用PhantomJS包时:

<PackageReference Include="PhantomJS" Version="2.1.1">
  <IncludeAssets>all</IncludeAssets>
</PackageReference>
Run Code Online (Sandbox Code Playgroud)

我跑的时候什么也没做dotnet build.

我希望它将PhantomJS包中的文件复制到输出目录(或项目中的任何位置),这样我就可以使用PhantomJS包提供的二进制文件.

有没有其他方法将PhantomJS NuGet包的内容复制到MSBuild的输出目录?

Ric*_*ahl 8

我想你想使用:

<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
Run Code Online (Sandbox Code Playgroud)

在 main 中<PropertyGroup>,这会导致所有依赖项被复制到输出文件夹。这意味着每个依赖项都会被复制,因此在某些情况下这可能会非常混乱。

如果您想排除特定的程序集或包:

<ItemGroup>
    <-- won't copy to output folder -->
    <PackageReference Include="MahApps.Metro" version="1.6.5">
      <IncludeAssets>compile</IncludeAssets>
    </PackageReference>
    <PackageReference Include="Dragablz" version="0.0.3.203">
      <IncludeAssets>compile</IncludeAssets>
    </PackageReference>
    ... 

    <-- normal will copy to output folder -->
    <PackageReference Include="xmlrpcnet" version="3.0.0.266" />
    <PackageReference Include="YamlDotNet" version="6.0.0" />
</ItemGroup>


<ItemGroup>
    <!-- keep assembly reference from copying to output -->
    <Reference Include="$(SolutionDir)MarkdownMonster\bin\$(Configuration)\$(TargetFramework)\MarkdownMonster.exe">
      <Private>false</Private>
    </Reference> 
</ItemGroup>

Run Code Online (Sandbox Code Playgroud)

compile 在这种情况下意味着它们可用于编译,但不会复制到输出文件夹。

  • 不,那是不对的@LosManos。如果您有多个组,它们都会聚合到一个组中。但顺序可能很重要,因此您可能希望将该指令移至该部分的末尾。 (2认同)

小智 6

有两种解决方案:

1:

  <ItemGroup>
    <PackageReference Include="PhantomJS" Version="1.0.8" GeneratePathProperty="true" />
  </ItemGroup>

  <Target Name="CopyPdfExe" AfterTargets="Build">
    <Copy SourceFiles="(PkgPhantomJS)\tools\phantomjs\phantomjs.exe" DestinationFolder="$(OutDir)" />
  </Target>
Run Code Online (Sandbox Code Playgroud)

2:

  <ItemGroup>
    <PackageReference Include="PhantomJS" Version="1.0.8" GeneratePathProperty="true" />
  </ItemGroup>

  <ItemGroup>
    <None Include="$(PkgPhantomJS)\tools\phantomjs\phantomjs.exe" CopyToOutputDirectory="PreserveNewest" />
  </ItemGroup>
Run Code Online (Sandbox Code Playgroud)

更喜欢 #2 因为如果这个项目被另一个项目引用,.exe 也可以复制到输出文件夹


Eri*_*rdt 2

NuGet 中的语法<PackageReference>使用传递依赖项,就像project.json语法一样。因此,适用相同的规则。请参阅此NuGet v3packages.config ,其中讨论了新语法中哪些内容有效,哪些无效。具体来说

您不能依赖 install.ps1 或 uninstall.ps1 来运行。这些文件将在使用packages.config时执行,但在v3中将被忽略。所以你的包需要在它们不运行的情况下可用。Init.ps1 仍将在 NuGet 3 上运行。

要将文件复制到输出目录,PhantomJS需要更改 NuGet 包以使用contentFiles

  • 以下是 MSBuild 存储库中的示例:https://github.com/Microsoft/msbuild/blob/6851538897f5d7b08024a6d8435bc44be5869e53/build/NuGetPackages/Microsoft.Build.Runtime.nuspec#L30-L32 (3认同)
  • 有人有如何使用 contentFiles 的 nuspec 文件示例吗? (2认同)