防止在NuGet content和contentFiles文件夹中重复文件

Mar*_*ryl 5 visual-studio nuget nuget-package

我的NuGet软件包需要传递一些相当大的文件来构建输出目录。

在旧的NuGet模型中,此类文件必须存储在的content文件夹中.nupkg在NuGet 3.3中引入新模型中,此类文件必须存储在contentFilesfolder中

为了与旧版本的NuGet以及主要与Package.config软件包管理格式保持兼容性,我需要将文件复制到两个文件夹中。不幸的是,这几乎使包装的尺寸增加了一倍。

有办法防止这种情况吗?我可以以某种方式链接contentFilescontent文件夹吗?

Dan*_*iel 7

NuGet 的 MSBuild 目标中找到了详细描述此内容的更新文档 。

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

<Content Include="..\win7-x64\libuv.txt">
  <Pack>true</Pack>
  <PackagePath>content\myfiles\</PackagePath>
</Content>
Run Code Online (Sandbox Code Playgroud)

如果您想您的所有内容复制到只有特定的根文件夹(S)(而不是contentcontentFiles两者),你可以使用MSBuild的属性ContentTargetFolders,默认为“内容; contentFiles”,但可以设置为任何其他文件夹的名称。请注意,只是在指定“contentFiles”ContentTargetFolders下放文件contentFiles\any\<target_framework>contentFiles\<language>\<target_framework>基于buildAction


Mar*_*ich 3

如果您只想将文件输出到构建输出(content仅将文件复制到输出目录,但确实将其设置为复制到输出目录项),您可以使用完全不同的方法,创建一个 msbuild 文件,该文件将被纳入项目中。

您可以通过将文件test.jpg放入tools文件夹(您也可以使用build)并将Your.Package.Id.targets文件添加到build文件夹(名称是带有扩展名的包的包 ID .targets)来完成此操作,其中包含以下内容:

<?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>
Run Code Online (Sandbox Code Playgroud)

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

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

请注意,您可以将Inclue-path 设置为任何内容,具体取决于文件在包中的位置。您还可以使用通配符(但随后设置Link%(Filename)%(Extension)