在NuGet的content和contentFiles文件夹中避免重复文件

9
我的NuGet包需要将一些相当大的文件传递到构建输出目录。
在旧的NuGet模型中,这些文件必须存储在.nupkg的content文件夹中。而在NuGet 3.3中引入的新模型中,这些文件必须存储在contentFiles文件夹中。
为了与早期版本的NuGet保持兼容性,主要是与Package.config包管理格式保持兼容性,我需要将文件复制到两个文件夹中。不幸的是,这几乎会使包的大小翻倍。
有没有办法防止这种情况发生?我能否以某种方式将contentFiles链接到content文件夹?
2个回答

10

发现有关此详细信息的更新文档,请查看NuGet的MSBuild目标

默认情况下,除非指定包路径,否则所有内容都会添加到包中的contentcontentFiles\any\<target_framework>文件夹的根目录中,并保留相对文件夹结构:

<Content Include="..\win7-x64\libuv.txt">
  <Pack>true</Pack>
  <PackagePath>content\myfiles\</PackagePath>
</Content>

如果您想将所有内容复制到特定的根文件夹(而不是contentcontentFiles两个文件夹),则可以使用MSBuild属性ContentTargetFolders,默认为"content;contentFiles",但可以设置为任何其他文件夹名称。请注意,在ContentTargetFolders中仅指定"contentFiles"会将文件放置在contentFiles\any\<target_framework>contentFiles\<language>\<target_framework>下,具体取决于buildAction


1
这对我来说是有效的方式,而@martin-ullrich的解决方案仍然给了我内容+内容文件。 - Andreas H.

3
如果您只想将文件输出到构建输出(content仅将文件复制到输出目录,但不会将其设置为复制到输出目录项),则可以通过创建一个将包含在项目中的msbuild文件来使用完全不同的方法。
您可以通过将文件 - 比如说test.jpg放入tools文件夹(您也可以使用build),并在build文件夹中添加一个Your.Package.Id.targets文件(名称为带有.targets扩展名的软件包ID),并添加以下内容来实现此目的:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup>
    <Content Include="$(MSBuildThisFileDirectory)..\tools\test.jpg">
      <Link>test.jpg</Link>
      <Visible>false</Visible>
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
    </Content>
  </ItemGroup>
</Project>

无论使用哪种“样式”的NuGet引用(packages.configPackageReference),此目标都将自动导入到项目文件中,并且应向旧版本的VS兼容,只要它们支持NuGet和ToolsVersion 4.0

Link元数据表示文件在输出/发布目录中的位置。您可以将其设置为例如defaultContent\images\foo.jpg以创建嵌套结构并重命名文件。(您甚至可以使用MSBulid变量来使用一些引用项目的配置)。Visible元数据防止解决方案资源管理器显示文件的完整相对路径,这可能会导致大量嵌套的..节点。 CopyToPublishDirectory适用于.NET Core / ASP.NET Core应用程序或使用Publish目标进行发布的基于SDK的项目。

请注意,根据文件所在的包的位置,您可以将Inclue路径设置为任何内容。您还可以使用通配符(但然后将Link设置为%(Filename)%(Extension)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接