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

C# 如何告诉nuget将包资源文件添加为链接,而不是将它们复制到项目目录中 简介(如何将资源打包到nuget包中),c#,.net,nuget,C#,.net,Nuget,要将一些资源文件打包到nuget包中,通常会执行以下操作 将所有资源文件放入nuget包的content\目录中。这将由.nuspec文件中的以下行指定: <files> <file src="Project\bin\Release\script.js" target="content\js\script.js" /> <files> 在包安装过程中,另一个项目.csproj被注入标签: <Content Include="js\script.js

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

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

<files>
  <file src="Project\bin\Release\script.js" target="content\js\script.js" />
<files>
在包安装过程中,
另一个项目.csproj
被注入标签:

<Content Include="js\script.js" />
我宁愿避免的暴力解决方案 现在,我能想到的一个“以艰难的方式”解决方法是:

  • 未将资源文件置于
    内容\
    下,因此不会自动添加它们
  • 编写
    Install.ps1
    脚本来破解csproj文件结构并手动添加必要的XML片段
然而,这有以下缺点:

  • 我的所有nuget软件包在其
    Install.ps1
    中都需要相同的脚本片段
  • 在安装我的软件包时,VisualStudio中会出现令人讨厌的“项目重新加载提示”

由于NuGet目前不支持这种开箱即用的方式,您可以选择使用PowerShell或使用自定义MSBuild目标

PowerShell

  • 将您的资源放在NuGet包的内容目录之外(正如您已经建议的那样)
  • 在install.ps1中使用PowerShell添加文件链接
如果使用Visual Studio对象模型(EnvDTE),应该能够避免出现项目重新加载提示。我想看看Project.ProjectItems.AddFromFile(…)是否适合您

MSBuild目标

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

请注意,安装NuGet软件包时,.props在项目文件开始时导入,而.targets则在项目结束时导入

定制NuGet


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

谢谢!我最终通过install.ps1和EnvDTE使用powershell实现了这一点。哦,是的。你可以在这里看到它的作用:
<Content Include="js\script.js" />
<Content Include="packages\Project.1.0.0\content\js\script.js">
  <Link>js\script.js</Link>
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>