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

简介(如何将资源打包到nuget包中)

要将一些资源文件打包到nuget包中,通常会执行以下操作。

将所有资源文件放入nuget包的content\目录中。 这将由.nuspec文件中的以下行指定:

    

现在,当这个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 //  tag (see below) 

在软件包安装过程中, AnotherProject.csproj注入了标签:

  

这是原始资源的物理副本(位于packages\目录下)。

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

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

  js\script.js PreserveNewest  

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

现在,我能想到的一个“努力工作”的解决方法是:

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

然而,这具有以下缺点:

  • 我的所有nuget包需要在他们的Install.ps1使用相同的脚本片段,
  • 安装我的软件包时,Visual Studio中会出现一个令人讨厌的“项目重新加载提示”。

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

电源shell

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

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

MSBuild目标

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

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

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

定制NuGet

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