我正在尝试在.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>