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

jac*_*cus 10 .net c# nuget

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

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

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

<files>
  <file src="Project\bin\Release\script.js" target="content\js\script.js" />
<files>
Run Code Online (Sandbox Code Playgroud)

现在,当安装此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)
Run Code Online (Sandbox Code Playgroud)

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

<Content Include="js\script.js" />
Run Code Online (Sandbox Code Playgroud)

这是原始资源的物理副本(位于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>
Run Code Online (Sandbox Code Playgroud)

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

现在,我能想到的一个"难以实现"的解决方法是:

  • 没有放置资源文件,content\所以它们不会自动添加,
  • 编写Install.ps1破解csproj文件结构的脚本并手动添加必要的XML片段,

然而,这具有以下缺点:

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

Mat*_*ard 4

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

电源外壳

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

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

MSBuild 目标

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

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

请注意,安装 NuGet 包时,.props 将在项目文件的开头导入,而 .targets 将在项目末尾导入。

自定义 NuGet

另一种选择(需要更多工作)是修改 NuGet 以支持您想要执行的操作。