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

Msbuild 如何将文件从.NET Core csproj中引用的NuGet包复制到输出目录?,msbuild,.net-core,csproj,Msbuild,.net Core,Csproj,我正在尝试在.NET核心csproj应用程序中使用。但我认为不可能为NuGet使用新的PackageReference语法 当我像这样引用PhantomJS包时: <PackageReference Include="PhantomJS" Version="2.1.1"> <IncludeAssets>all</IncludeAssets> </PackageReference> 全部的 当我运行dotnet build时,它不会做任何事

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

当我像这样引用PhantomJS包时:

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

全部的
当我运行
dotnet build
时,它不会做任何事情

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

是否有其他方法可以使用MSBuild将PhantomJS NuGet包的内容复制到输出目录?

NuGet中的
语法使用可传递的依赖项,就像
project.json
语法一样。因此,同样的规则也适用。请看这篇文章,它讨论了在
packages.config
和更新的语法之间什么起作用,什么不起作用。具体地

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


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

尝试
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]
dotnet publish[]-c |--配置]-[f |--框架][--强制][--清单][--无依赖关系][--无恢复]-[o |--输出]-[r |--运行时][--自包含]-[v |--详细性][--版本后缀]
dotnet发布[-h |--帮助]

请参见

我想您应该使用:

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

如果要排除特定的程序集或程序包,请执行以下操作:

<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>



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

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

没有一个


全部的
而是为了将引用的程序集和其他文件复制到生成输出。看见
有两种解决方案:

1:

2:


首选#2,因为如果此项目被另一个项目引用,也可以将.exe复制到输出文件夹

谢谢。我认为这真的很不幸。我认为期望所有包都更改其nuspec是不现实的,如果PackageReference具有复制给定目录或文件的功能(例如,复制到输出目录),则会更好。我会保持这一点,msbuild中有各种技巧可以实现这一点。有人有关于如何使用contentFiles的示例nuspec文件吗?以下是msbuild的repo中的示例:感谢您在运行dotnet build时将文件放入bin文件夹。向前迈出了一小步。
<PackageReference Include="PhantomJS" Version="2.1.1">
  <ExludeAssets>all</ExcludeAssets>
</PackageReference>
  <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>
  <ItemGroup>
    <PackageReference Include="PhantomJS" Version="1.0.8" GeneratePathProperty="true" />
  </ItemGroup>

  <ItemGroup>
    <None Include="$(PkgPhantomJS)\tools\phantomjs\phantomjs.exe" CopyToOutputDirectory="PreserveNewest" />
  </ItemGroup>