Как включить текстовый файл вместе с моей библиотекой классов в пакет NuGet, который Visual Studio 2017 создает для меня?

Мой текстовый файл находится в моем проекте библиотеки классов. У меня для действия сборки установлено значение «Контент», а для параметра «Копировать в выходной каталог» установлено значение «Копировать, если оно новее», поэтому в .csproj есть такой раздел, как:

<ItemGroup>
  <Content Include="MyFile.txt">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </Content>
</ItemGroup>

Я делаю это, потому что мне нужно использовать текстовый файл из моей библиотеки классов, и я не могу использовать его как встроенный ресурс, потому что я хочу разрешить конечным пользователям редактировать его. Когда я использую VS 2017 для создания пакета, он дает мне .nuspec с таким разделом:

<contentFiles>
  <files include="any/net46/MyFile.txt" buildAction="Content" />
  <files include="any/netstandard1.3/MyFile.txt" buildAction="Content" />
</contentFiles>

Затем, когда я ссылаюсь на пакет из другого проекта, MyFile.txt появляется в корне проекта с параметром «Действие сборки», для которого установлено значение «Содержимое», но для параметра «Копировать в выходной каталог» установлено значение «Не копировать». Я просто хочу, чтобы файл был включен вместе с .dll, не будучи включенным в проект ссылки.


person user1676558    schedule 17.03.2017    source источник


Ответы (2)


Далее будет создан пакет nuget, который сохранит выбранные вами файлы вместе с dll вашего пакета, когда приложение-потребитель установит его, и это можно сделать полностью через интегрированную среду разработки Visual Studio 2017.

Предположим, что у вас есть проект C# с именем Foo.Bar в вашем решении, который вы хотите встроить в пакет nuget:

В Visual Studio щелкните правой кнопкой мыши проект Foo.Bar > Properties и перейдите на вкладку Package. Убедитесь, что значение Package id: равно Foo.Bar.

Создайте файл Foo.Bar.targets в том же каталоге, что и ваш файл Foo.Bar.csproj, со следующим содержимым:

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

Щелкните правой кнопкой мыши проект в Visual Studio 2017 и выберите Edit Foo.Bar.csproj. Поместите следующий блок в открытый файл проекта:

<ItemGroup>
    <None Include="MyFile.txt">
      <Pack>true</Pack>
      <PackagePath>build</PackagePath>
    </None>
    <None Include="Foo.Bar.targets">
      <Pack>true</Pack>
      <PackagePath>build</PackagePath>
    </None>
  </ItemGroup>

Теперь, когда вы щелкните проект правой кнопкой мыши и выберите Pack (или если вы запустите dotnet pack из командной строки в каталоге, где находится ваш проект), он сгенерирует файл .nupkg для вашего проекта Foo.Bar. MyFile.txt и Foo.Bar.targets будут в папке build внутри него.

В качестве теста я установил его в пример проекта консольного приложения. После этого MyFile.txt появится в обозревателе решений консольного приложения, и его можно открыть и отредактировать. Кроме того, если я публикую консольное приложение, Foo.Bar.dll и MyFile.txt находятся в папке bin > Release > [TargetFramework] > publish опубликованных файлов (если они опубликованы с использованием профиля папки на локальном диске).

Интересно отметить, что на момент написания статьи, если вы щелкните правой кнопкой мыши MyFile.txt в консольном приложении, в котором установлен пакет, и выберите Properties, вы увидите, что Copy to Output Directory установлено на Always. Если я попытаюсь изменить его на Do Not Copy или что-то еще, он вернется к Always, когда диалоговое окно будет закрыто, несмотря на нажатие OK. Это будет действовать так, как если бы вы нажимали Cancel каждый раз. Это связано с изменением исходного файла Foo.Bar.csproj, из которого был создан пакет nuget, а именно: <CopyToOutputDirectory>Always</CopyToOutputDirectory>.

person David Gunderson    schedule 10.08.2018
comment
Привет, я немного борюсь с точной конфигурацией моего файла csproj. Есть ли доступная информация? - person Stefan; 18.04.2019
comment
В моем приведенном выше ответе использовались некоторые примеры, представленные в разделе «Включение содержимого в пакет» на следующей странице: github.com/NuGet/Home/wiki/. Что касается моего ответа выше, файл csproj, чтобы стать пакетом nuget, нуждается в узле ItemGroup на один уровень ниже внутри узла Project (когда вы щелкаете правой кнопкой мыши csproj в Visual Studio и выбираете «Редактировать .csproj»). - person David Gunderson; 18.04.2019

Если вы хотите сохранить .nuspec, вы можете отредактировать его вручную и добавить атрибут copyToOutput="true".

Если вы используете VS2017 и хотите отредактировать свой .csproj, вы должны иметь возможность указать дополнительные метаданные в своем файле .csproj (и при необходимости вы можете установить пользовательское действие сборки):

<Content Include="MyFile.txt">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    <IncludeInPackage>true</IncludeInPackage>
    <BuildAction>Content</BuildAction>
    <CopyToOutput>true</CopyToOutput>
</Content>
person Igor Labutin    schedule 20.03.2017
comment
Насколько я помню, я пробовал подобные вещи, и они не работали. Я использовал следующий обходной путь, если он кому-то нужен: stackoverflow.com/a/30386836/1676558 - person user1676558; 27.03.2017