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

Как скопировать текстовый файл, включенный вместе с 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 он отображается в содержимом пакета, когда он один. Но когда я добавляю что-то под <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 как-то мешает?


person cezn    schedule 04.07.2018    source источник


Ответы (2)


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

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

введите здесь описание изображения

Проверьте update ответ на аналогичную проблему для некоторые подробности.

person Leo Liu-MSFT    schedule 04.07.2018
comment
Спасибо за наводку и видео! Предположительно, в тестовом пакете должно быть только ./any/any/file.txt, верно? Если я использую указанный выше файл .nuspec, я получаю следующую ошибку: Could not find a part of the path 'E:\source\repos\mzLib\contentFiles'. Когда я удаляю contentFiles/ из атрибута src в <file src="contentFiles/any/any/file.txt" target="contentFiles/any/any" />, тестовый пример работает. - person cezn; 07.07.2018
comment
Я получаю тот же эффект, что и в Edit # 1 выше... это исправление не работает для моего основного проекта, но, по крайней мере, contentFile отображается в обозревателе пакетов NuGet для тестового примера. . - person cezn; 07.07.2018

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

<contentFiles>
        <!-- Include Assets as Content -->
        <files include="foo\file.txt" buildAction="EmbeddedResource" />
</contentFiles>
person Vikas Chaturvedi    schedule 04.07.2018
comment
Спасибо за указатель. Это работает, но у меня все еще есть проблемы с этим вне тестового примера. Я добавил к моему вопросу выше с тем, что я видел. - person cezn; 07.07.2018