如何告诉NuGet将包资源文件添加为链接,而不是复制到项目目录中?

12

介绍(如何将资源打包成NuGet包)

如果想要将一些资源文件打包成NuGet包,通常需要按照以下步骤进行。

将所有资源文件放到NuGet包的content\目录中。这可以在.nuspec文件中通过下面的行指定:

<files>
  <file src="Project\bin\Release\script.js" target="content\js\script.js" />
<files>

现在,当这个NuGet包被安装到AnotherProject中时,会出现以下文件结构:

Solution.sln
packages\Project.1.0.0\content\js\script.js  // the original resource file
AnotherProject\js\script.js                  // a physical copy 
AnotherProject\AnotherProject.csproj         // <Content /> tag (see below)
在安装软件包时,AnotherProject.csproj 被注入了一个标签。
<Content Include="js\script.js" />

这段是关于原始资源的实体副本(位于 packages\ 目录下)。

实际问题(如何将资源作为链接打包到 nuget 包中)

我的目标不是在 AnotherProject 目录下拥有资源文件的物理副本,而是一个指向 packages\ 目录下原始资源的“链接”。在 csproj 中,应该像这样:

<Content Include="packages\Project.1.0.0\content\js\script.js">
  <Link>js\script.js</Link>
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>

我更愿意避免的暴力解决方案

现在,我能想到的一种“用最麻烦的方式解决”方法是:

  • 不要将资源文件放在content\下,这样它们就不会自动添加,
  • 编写Install.ps1脚本,该脚本将hack csproj文件结构并手动添加必要的XML部分,

然而,这样做有以下缺点:

  • 所有我的NuGet包都需要相同的脚本代码片段Install.ps1
  • 安装我的包时,在Visual Studio中会出现一个讨厌的“项目重新加载提示”。
1个回答

4
由于NuGet目前不支持此功能,您的选择是使用PowerShell或自定义MSBuild目标。

PowerShell

  • 将资源留在NuGet包的Content目录之外(如您已建议的那样)。
  • 在install.ps1中使用PowerShell添加文件链接。

如果使用Visual Studio对象模型(EnvDTE),则应该能够避免项目重新加载提示。您可以查看Project.ProjectItems.AddFromFile(...),看看是否适用于您。

MSBuild目标

  • NuGet支持将导入语句添加到指向MSBuild .props和/或.targets文件的项目中。因此,您可以将资源放入NuGet包的tools目录中,并从自定义MSBuild .props/.targets文件中引用它们。

通常,自定义的.props和.targets用于自定义构建过程。但是它们只是MSBuild项目文件,因此您可以将资源项添加到这些项目文件中。

请注意,.props在安装NuGet包时在项目文件开头导入,而.targets在项目结尾导入。

自定义NuGet

另一个选项是修改NuGet以支持您想要做的事情,但这需要更多的工作。


谢谢!我最终使用install.ps1和EnvDTE在powershell中使其工作了。 http://www.rhyous.com/2016/03/03/nuget-for-source-using-add-as-link-1/ - Rhyous
哦,是的。您可以在此处查看其运行情况:https://github.com/rhyous/SimpleArgs/tree/master/NuGet - Rhyous

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