如何在使用 NuGet 包的 C# 代码构建过程中复制文本文件?

5
如何复制一个包含在NuGet包中的文本文件以及DLLs?当我在另一个解决方案中使用我的自定义NuGet包时(例如:\dev),结果文件结构位于:\dev\package\projectId\lib\netstandard2.0\,其中有许多DLL和一个文本文件,例如file.txt。在构建解决方案时,所有DLL都被复制,但文本文件被留下了。在.nuspec文件中,我最初将文件包含在<files><file src="foo\file.txt" target="lib\netstandard2.0"/></files>下。当还原NuGet包时,file.txt出现在packages文件夹中,但它没有被复制到构建目录中。

尝试1:我尝试使用nuspec文件中的contentFiles属性,因为nuspec reference在那里引用了几次。我成功使用这个新属性使nuget.exe pack命令工作(即没有语法错误),但内容(file.txt)处理方式没有改变。

尝试2:我尝试使用一个projectId.targets文件。这个使用了一个Target,其中包含该文件的ItemGroup。然后,我尝试使用一个指向目标文件夹的Copy事件,即$(OutputPath)

看起来很难将一个包含在软件包中的文件复制到构建目录中,需要深入研究MSBuild事件等等。

我非常困惑,在这方面任何指点都会受到欢迎。

编辑#1:

我尝试根据下面的建议向元数据添加了此部分:

<contentFiles> <files include="any\any\file.txt" buildAction="EmbeddedResource" /> </contentFiles>

这在小型测试中可行。 file.txt 在 Visual Studio 和构建目录中都能很好地显示出来。奇怪的是,使用完全相同的语法在我的主项目中却不起作用(我在两个项目中都使用 .NET Core 2.0)。此外,在 NuGet 包资源管理器中,当它独立存在时,它会显示在包内容中。但是当我在 <files><file src="lib\netstandard2.0\test.dll" target="lib\netstandard2.0"/></files> 下添加一些东西时,它就从该视图中消失了。

编辑 #2:

我认为还有其他的问题...这里是我们主要项目的.nuspec文件。当我按照以下工作建议添加一个内容文件时,它仍然不会出现(无论是.NET Core 2.0还是.NET Framework 4.7.1)。是.targets文件在搞鬼吗?
2个回答

2
如何在使用NuGet包的C#代码构建过程中复制文本文件?
您应该使用“contentFiles”属性,并为文本文件“file.txt”设置“copyToOutput =“true””。
我的测试.nuspec文件:
<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
  <metadata>
    <id>MyTestCore</id>
    <version>5.0.0</version>
    <authors>TestContentFile</authors>
    <owners>TestContentFile</owners>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>Package Description</description>
    <contentFiles>
      <files include="any/any/file.txt" buildAction="content" flatten="true" copyToOutput="true"/>
    </contentFiles>
  </metadata>

  <files>
    <file src="contentFiles/any/any/file.txt" target="contentFiles/any/any" />
  </files>
</package>

将此.nuspec文件打包后,将nuget包添加到项目中,构建项目,文本文件将复制到构建目录:

在此输入图片描述

有关更多详细信息,请查看更新的答案以获取类似问题的一些更多细节


感谢提供指针和视频!假设测试包只应该有 ./any/any/file.txt,对吗?如果我使用上面的 .nuspec 文件,我会得到以下错误:无法找到路径 E:\source\repos\mzLib\contentFiles。当我从 <file src="contentFiles / any / any / file.txt" target="contentFiles / any / any" />中的src属性中删除了contentFiles /时,测试用例就可以工作了。 - cezn
我得到了与我在上面的“编辑#1”中提到的相同的效果...这个修复程序对我的主要项目无效,但至少contentFile在NuGet Package Explorer中显示出来了,以供测试使用。 - cezn

0

你必须为该文件定义构建操作。

<contentFiles>
        <!-- Include Assets as Content -->
        <files include="foo\file.txt" buildAction="EmbeddedResource" />
</contentFiles>

谢谢指针。这确实有效,但我在测试案例之外仍然遇到了麻烦。我在上面的问题中添加了我看到的内容。 - cezn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接