如何在 nuspec 文件中设置“复制到输出目录”属性?

问题描述 投票:0回答:4

请考虑以下 nuspec 文件:

<?xml version="1.0"?>
<package >
  [SOME METADATA]
  <files>
    <file src="bin\x64\$configuration$\GR*.filetype" target="content\" />
  </files>
</package>

上面已成功打包以“GR”开头的文件类型文件,并将它们添加到我的新引用解决方案中。

问题是我希望这些文件始终被复制到输出目录。我可以通过 nuspec 执行此操作,而无需手动修改新解决方案中的属性吗?

visual-studio-2015 nuget nuspec
4个回答
27
投票

如何在 nuspec 文件中设置“复制到输出目录”属性?

Martin 指出了正确的方向,我之前也有同样的要求,kjbartel`s 的回答对我很好。我把你的问题的答案贴在这里,更详细,希望能给你一些帮助。

要解决此问题,您可以按照以下步骤操作:

  1. 在你的项目文件夹中添加一个xx.targets文件,确保目标文件的名称与包id相同(TestDemo是我的包ID,所以.targets的名称是TestDemo.targets)。

  2. 在目标文件中添加以下代码:

    <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
     <ItemGroup>
      <None Include="$(MSBuildThisFileDirectory)GRabc.txt">
         <Link>GRabc.txt</Link>
         <CopyToOutputDirectory>Always</CopyToOutputDirectory>
      </None>
     </ItemGroup>
    </Project>
    

注意:“$(MSBuildThisFileDirectory)”的路径应该是相对路径,如果你不熟悉,可以使用绝对路径。

  1. 在 nuspec 文件中,将所需文件与目标文件一起添加到 Build 目录中。

      <files>
        <file src="bin\x64\Debug\GR*.txt" target="Build\" />
        <file src="TestDemo.targets" target="Build\" />
        <file src="bin\Debug\TestDemo.dll" target="lib\462" />
      </files>
    
  2. 打包此包,然后将其添加到其他项目中进行测试,可以正常工作。


4
投票

接受的答案对于非内容文件很有用,因为它在安装时不会链接到项目。

但是,我需要一个设置 xml 文件,该文件将添加到项目中,并且 nuget 包用户可以编辑它,并且包 dll 将从输出目录加载编辑后的 xml 文件。

由于内容文件不会复制到构建目录,因此我必须使用

.targets
文件将内容文件复制到输出目录。

nuspec
文件

<file src="TestDemo.targets" target="build"/>
<file src="Settings.xml" target="content/Configuration"/>

.targets
文件(文件名必须与包 ID 相同)

<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Target Name="AfterBuild">
    <Copy SourceFiles="$(ProjectDir)Configuration\Settings.xml" DestinationFolder="$(TargetDir)Configuration\" ContinueOnError="true" />
  </Target>
</Project>

3
投票

我有一个即将进行的小型项目,它依赖于几乎相同的解决方案。现在是 2024 年,带有

<ProjectReference>
的 SDK 风格项目现已成为常态(现在还不是更早)。 .nuspec 文件现在有一个新的
<contentfiles>
标签,用于 SDK 样式项目。为了向后兼容,建议仍然包含
<files>
标签。我将这一切编译到一个小型示例存储库中:https://github.com/Matheos96/any-file-in-nuget-package

该示例甚至缺少代码,证明您根本不需要编译任何内容来创建 NuGet 包。但截至今天,.csproj 文件是必需的,这里主要用作指定 .nuspec 位置的虚拟文件。希望这也对其他人有帮助。

README.md 中的更多说明


0
投票

使用新的 NuGet 版本,不需要自定义 MSBuild 目标。您所要做的就是使用设置为

PackageCopyToOutput
的 MSBuild 属性来标记要复制到使用项目的输出目录的相应内容文件:
true

<ItemGroup>
  <Content Include="MyFolder\MyFile.txt">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    <PackageCopyToOutput>true</PackageCopyToOutput>
  </Content>
</ItemGroup>

MSBuild 属性设置为

PackageCopyToOutput
会生成以下 NuGet 包规范文件:
true

注意 
<package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd"> <metadata> <contentFiles> <files include="any/net8.0/MyFolder/MyFile.txt" buildAction="Content" copyToOutput="true" /> </contentFiles> </metadata> </package>

XML 属性,它指示 NuGet 执行将内容文件复制到输出的所有操作。

    

© www.soinside.com 2019 - 2024. All rights reserved.