在旧的NuGet模型中,这些文件必须存储在.nupkg的content文件夹中。而在NuGet 3.3中引入的新模型中,这些文件必须存储在contentFiles文件夹中。
为了与早期版本的NuGet保持兼容性,主要是与Package.config包管理格式保持兼容性,我需要将文件复制到两个文件夹中。不幸的是,这几乎会使包的大小翻倍。
有没有办法防止这种情况发生?我能否以某种方式将contentFiles链接到content文件夹?
发现有关此详细信息的更新文档,请查看NuGet的MSBuild目标。
默认情况下,除非指定包路径,否则所有内容都会添加到包中的
content
和contentFiles\any\<target_framework>
文件夹的根目录中,并保留相对文件夹结构:
<Content Include="..\win7-x64\libuv.txt"> <Pack>true</Pack> <PackagePath>content\myfiles\</PackagePath> </Content>
如果您想将所有内容复制到特定的根文件夹(而不是
content
和contentFiles
两个文件夹),则可以使用MSBuild属性ContentTargetFolders
,默认为"content;contentFiles",但可以设置为任何其他文件夹名称。请注意,在ContentTargetFolders
中仅指定"contentFiles"会将文件放置在contentFiles\any\<target_framework>
或contentFiles\<language>\<target_framework>
下,具体取决于buildAction
。
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.config
,PackageReference
),此目标都将自动导入到项目文件中,并且应向旧版本的VS兼容,只要它们支持NuGet和ToolsVersion 4.0
。
Link
元数据表示文件在输出/发布目录中的位置。您可以将其设置为例如defaultContent\images\foo.jpg
以创建嵌套结构并重命名文件。(您甚至可以使用MSBulid变量来使用一些引用项目的配置)。Visible
元数据防止解决方案资源管理器显示文件的完整相对路径,这可能会导致大量嵌套的..
节点。 CopyToPublishDirectory
适用于.NET Core / ASP.NET Core应用程序或使用Publish
目标进行发布的基于SDK的项目。
请注意,根据文件所在的包的位置,您可以将Inclue
路径设置为任何内容。您还可以使用通配符(但然后将Link
设置为%(Filename)%(Extension)
)