介绍(如何将资源打包成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中会出现一个讨厌的“项目重新加载提示”。