Как сказать nuget добавить файлы ресурсов пакета в качестве ссылок, а не копировать их в каталог проекта

введение (как упаковать ресурсы в пакет nuget)

чтобы упаковать некоторые файлы ресурсов в пакет nuget, что обычно делается, является следующим.

Поместите все файлы ресурсов в content каталог пакета nuget. Это будет указано в следующей строке :

<files>
  <file src="ProjectbinReleasescript.js" target="contentjsscript.js" />
<files>

теперь, когда этот пакет nuget устанавливается в AnotherProject следующая структура файла появляется:

Solution.sln
packagesProject.1.0.0contentjsscript.js  // the original resource file
AnotherProjectjsscript.js                  // a physical copy 
AnotherProjectAnotherProject.csproj         // <Content /> tag (see below)

во время установки пакета, AnotherProject.csproj ввели тег:

<Content Include="jsscript.js" />

и это для физической копии исходного ресурса (который находится под ).

фактическая проблема (как упаковать ресурсы в пакет nuget в качестве ссылки)

моя цель-не иметь физической копии файла ресурсов в AnotherProject каталог, а скорее "Ссылка" на исходный ресурс в разделе . В csproj, это должно выглядеть так:

<Content Include="packagesProject.1.0.0contentjsscript.js">
  <Link>jsscript.js</Link>
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>

решение грубой силы, которого я бы предпочел избежать

теперь, один" сделать это трудным путем " обходной путь, который я могу придумать:

  • не помещать файлы ресурсов под content так они не добавляются автоматически,
  • писать Install.ps1 скрипт, который взломает файловую структуру csproj и добавит необходимый фрагмент XML вручную,

это, однако, имеет следующие недостатки:

  • все мои пакеты nuget нуждаются в одном и том же фрагменте скрипта в их Install.ps1,
  • при установке моих пакетов в Visual Studio появится неприятное "приглашение перезагрузки проекта".

1 ответов


поскольку NuGet в настоящее время не поддерживает это из коробки, ваши варианты либо использовать PowerShell, либо использовать настраиваемую цель MSBuild.

PowerShell

  • оставьте свои ресурсы за пределами каталога содержимого в пакете NuGet (как вы уже предлагали).
  • добавьте ссылку на файл с помощью PowerShell в установке.ps1.

вы должны быть в состоянии избежать запрос перезагрузки проекта если вы используете объектная модель Visual Studio (EnvDTE). Я бы взглянул на проект.ProjectItems.AddFromFile(... чтобы посмотреть, сработает ли это для вас.

MSBuild target

  • NuGet поддерживает добавление инструкции import в проект, который указывает на MSBuild .реквизит и/или .целевой файл. Таким образом, вы могли бы поместить свои ресурсы в инструменты каталог вашего пакета NuGet и ссылаться на них из пользовательского MSBuild .реквизит./цели файл.

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

обратите внимание, что .реквизит импортируется в начале файла проекта при установке пакета NuGet, в то время как .целевые показатели импортируются в конце проекта.

Настройка NuGet

другой вариант, который бы больше работы, было бы изменить NuGet для поддержки того, что вы хотите сделать.