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

时间:2014-08-18 16:07:01

标签: c# .net nuget

简介(如何将资源打包到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目录中拥有资源文件的物理副本,而是使用&#34;链接&#34;到packages\目录下的原始资源。在csproj中,这应该是这样的:

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

我宁愿避免的强力解决方案

现在,一个人做了很多事情&#34;我能想到的解决方法是:

  • 没有将资源文件放在content\下,因此不会自动添加,
  • 编写Install.ps1脚本,该脚本会破解csproj文件结构并手动添加必要的XML部分,

然而,这有以下缺点:

  • 我的所有nuget包需要在Install.ps1
  • 中使用相同的脚本
  • 安装我的软件包时,会出现一个讨厌的项目重新加载提示&#34;在Visual Studio中。

1 个答案:

答案 0 :(得分:3)

由于NuGet目前不支持开箱即用,因此您可以选择使用PowerShell或使用自定义MSBuild目标。

<强>的PowerShell

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

如果使用Visual Studio对象模型(EnvDTE),则应该能够避免项目重新加载提示。我会看看Project.ProjectItems.AddFromFile(...),看看它是否适合你。

MSBuild目标

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

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

请注意,安装NuGet包时会在项目文件的开头导入.props,同时在项目结束时导入.targets。

自定义NuGet

另一个需要做更多工作的选择是修改NuGet以支持你想要做的事情。