Как скопировать текстовый файл из пакета NuGet во время сборки кода C #, который использует пакет? - PullRequest
0 голосов
/ 04 июля 2018

Как скопировать текстовый файл, который был включен вместе с библиотеками DLL в пакет NuGet?

Когда я использую свой собственный пакет NuGet в другом решении (c:\dev\ для этого примера), результирующая файловая структура в c:\dev\package\projectId\lib\netstandard2.0\ имеет много DLL и текстовый файл, скажем file.txt. Все библиотеки DLL копируются при создании решения, но текстовый файл остается позади.

В файле .nuspec я изначально включил файл в <files><file src="foo\file.txt" target="lib\netstandard2.0"/></files>. file.txt попадает в папку пакетов при восстановлении пакета NuGet, но не копируется в каталог сборки.

Попытка 1: я попытался использовать свойство contentFiles в файле nuspec, так как ссылка nuspec указывает на это несколько раз. Я получил команду 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 Package Explorer он отображается в содержимом пакета, когда он один. Но когда я добавляю что-то под <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 ]

0 голосов
/ 04 июля 2018

Как скопировать текстовый файл из пакета NuGet во время сборки кода C #, который использует пакет?

Вы должны использовать свойство contentFiles и установить copyToOutput="true" для текстового файла file.txt.

Мой тестовый файл .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 в проект, соберите проект, текстовый файл будет скопирован в каталог сборки:

enter image description here

Проверьте обновление ответ на аналогичную проблему для получения дополнительной информации.

0 голосов
/ 04 июля 2018

Вы должны определить действие сборки для файла.

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