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



我正在尝试在.NET core csproj应用程序中使用PhantomJS NuGet包。但我认为不可能为 NuGet 使用新的PackageReference语法。

当我像这样引用PhantomJS包时:

<PackageReference Include="PhantomJS" Version="2.1.1">
  <IncludeAssets>all</IncludeAssets>
</PackageReference>

当我运行dotnet build时它不做任何事情.

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

有没有另一种方法可以使用MSBuild将PhantomJS NuGet包的内容复制到输出目录?

我想你想使用:

<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>

在主<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)MarkdownMonsterbin$(Configuration)$(TargetFramework)MarkdownMonster.exe">
      <Private>false</Private>
    </Reference> 
</ItemGroup>

在此上下文中,compile意味着它们可用于编译,但不会复制到输出文件夹。

有两种解决方案:

1:

  <ItemGroup>
    <PackageReference Include="PhantomJS" Version="1.0.8" GeneratePathProperty="true" />
  </ItemGroup>
  <Target Name="CopyPdfExe" AfterTargets="Build">
    <Copy SourceFiles="$(PkgPhantomJS)toolsphantomjsphantomjs.exe" DestinationFolder="$(OutDir)" />
  </Target>

阿拉伯数字:

  <ItemGroup>
    <PackageReference Include="PhantomJS" Version="1.0.8" GeneratePathProperty="true" />
  </ItemGroup>
  <ItemGroup>
    <None Include="$(PkgPhantomJS)toolsphantomjsphantomjs.exe" CopyToOutputDirectory="PreserveNewest" />
  </ItemGroup>

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

NuGet 中的<PackageReference>语法使用传递依赖项,就像project.json语法一样。 因此,相同的规则适用。 请参阅此 NuGet v3,其中讨论了在 packages.config 和较新的语法之间起作用和不起作用的内容。 具体说来

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

若要获取要复制到输出目录的文件,需要将 NuGet 包PhantomJS更改为使用 contentFiles。

标签名称具有误导性。尝试

<PackageReference Include="PhantomJS" Version="2.1.1">
  <IncludeAssets>none</IncludeAssets>
</PackageReference>

<PackageReference Include="PhantomJS" Version="2.1.1">
  <ExcludeAssets>all</ExcludeAssets>
</PackageReference>

而是将引用的程序集和其他文件复制到生成输出。看https://learn.microsoft.com/en-us/nuget/consume-packages/package-references-in-project-files

尝试dotnet publish

dotnet publish [<PROJECT>] [-c|--configuration] [-f|--framework] [--force] [--manifest] [--no-dependencies] [--no-restore] [-o|--output] [-r|--runtime] [--self-contained] [-v|--verbosity] [--version-suffix]
dotnet publish [-h|--help]

请参阅 https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-publish?tabs=netcore2x

我知道

这是一个老问题,但对我有用的是将 IncludeAssets 设置为"运行时">

实际上,在原始问题中声称不起作用的是 .NET6:

<PackageReference Include="PhantomJS" Version="2.1.1">
  <IncludeAssets>all</IncludeAssets>
</PackageReference>

相关内容

  • 没有找到相关文章

最新更新