如何告诉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以支持你想要做的事情。