创建 NuGet 包,在安装时将内容复制到 $(OutputPath) 而不管机器

Create NuGet package that when installed copies content to $(OutputPath) regardless of machine

我正在尝试获取包含在我的 NuGet 程序包中的内容文件,以将其复制到目标 C# 的 $(OutputPath)(在我的例子中是 bin\Debug\netcoreapp3.1,所有 DLL 结束的地方)构建目标时的项目。这需要在构建机器上的开发人员盒子 上工作。这是我目前所拥有的。

我创建了一个带有内容节点的 NuGet 包项目

<ItemGroup>
  <Content Include="testsettings.json">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </Content>
</ItemGroup>

我正在使用 pack target 输入 IncludeContentInPackContentTargetFolders 的默认值,它们分别是 truecontent;contentFiles

构建包时,我得到以下结构,其中 testsettings.json 出现在 .nupkg.

contentFiles\any\netcoreapp3.1content 文件夹中

当我将包安装到目标中时 .csproj,

当我构建目标项目时,DLL 转到 $(OutputPath)testsettings.json 没有复制到那里,这是有道理的,因为 Content[=86= 的默认值]节点的动作是None)。但是,我需要它表现得像 <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>.

我想,“好的,我将使用 Properties window 手动将 testsettings.json 更改为 Copy if newer":

这会向目标 .csproj 添加一个节点,如下所示:

<ItemGroup>
  <Content Update="C:\redacted\path\to\nuget\cache\package.name\N.N.N\contentFiles\any\netcoreapp3.1\testsettings.json">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </Content>
</ItemGroup>

非常适合 我的机器。这对于任何构建机器和任何其他开发人员的机器都会失败,因为该路径是特定我的机器。

如何创建包,以便在安装包时以可重复的方式将 testsettings.json 放在正确的位置?

在研究这个过程中,我注意到 testhost.exetesthost.dll 以某种方式神奇地出现在正确的位置,即使它们的源 NuGet 包的 .nuspec 和结构类似于矿。这让我对修改我的 NuGet 包的 .nuspec.nupkg、构建序列等需要做些什么感到茫然。

Preferable: 有没有办法做到这一点,如果有的话怎么做?非常不可取:我是否可以在目标项目中进行手动更改,以便我可以获得一种可靠的方法来复制随处可用的文件?

<ItemGroup>
    <Content Include="XXXXX.json">
        <PackageCopyToOutput>true</PackageCopyToOutput>     
    </Content>
</ItemGroup>

应该能满足你的要求。

在您的 NuGet 项目的 xxproj 文件中,添加上述代码并使用 <PackageCopyToOutput>.

在你要测试的新项目中,在安装你的NuGet包之前,记得先clear the NuGet Package cache,然后安装你的NuGet包并构建你的项目,检查XXXXX.json 文件已复制到输出。

相似线程: