Файлы пакета NuGet не копируются в контент проекта во время сборки
Я создаю веб-приложение MVC4 с профессионалом VS2012 с NuGet Package Manager версии 2.2.31210. У меня есть несколько проектов в моем решении, и все они используют различные пакеты, которые я установил с помощью NuGet. Один из моих проектов - это веб-приложение MVC4, в котором я использую такие пакеты, как bootstrap, jquery UI и т.д., Все они установлены с помощью NuGet.
Когда я клонирую новую копию всего моего решения из своего репозитория и создаю проект MVC4, функция восстановления пакета, похоже, работает: он создает каталог пакетов под директивным решением и заполняет все версии пакетов Я ожидаю увидеть. Однако файлы содержимого не копируются в соответствующие места в каталоге приложений MVC. Странно то, что он создает каталоги для контента, но не копирует сами файлы содержимого.
Например, я использую пакет Bootstrap Twitter, который появляется в пакетах /Twitter.Bootstrap.2.2.2. В проекте MVC в каталоге содержимого создается каталог с именем bootstrap (содержащий каталоги css, img и js). Но файлы css или js не копируются в эти каталоги!
Кто-нибудь знает, какое волшебное заклинание я должен произнести, чтобы заставить сборку скопировать эти файлы содержимого из каталога пакетов NuGet?
Ответы
Ответ 1
Я нашел обходной путь, но он уродлив. Выполняя следующую команду в консоли диспетчера пакетов NuGet: Update-Package -Reinstall
все файлы действительно скопированы в соответствующие места в каталогах Mvc project Content
и Scripts
.
К сожалению, это опасно, потому что вы, скорее всего, попадете в неправильные версии определенных пакетов. Например, в моем случае после того, как команда завершает выполнение (кстати, это занимает довольно много времени), я заканчиваю jQuery версии 1.4.4. Это старо, и я предполагаю, что это должна быть явная зависимость какого-либо другого пакета, который обновляется. Таким образом, кажется, что порядок, в котором пакеты фактически обновлены NuGet, значителен (он не просматривает все дерево зависимостей для всех пакетов и выбирает только последние версии из объединения всех зависимостей, что похоже на то, что это будет предпочтительное поведение). Скорее, по мере выполнения команды я вижу, что он несколько раз заменяет пакет jQuery разными версиями, поскольку он прокладывает себе путь по всем пакетам и их зависимостям, но только в конечном итоге с очень старой версией.
Аналогичным подходом является выполнение команды Update-Package -Reinstall
явно для каждого пакета, который вызывает мою проблему, но это невероятно утомительно и подвержено ошибкам.
Функция восстановления пакета NuGet должна давать тот же результат, что и выполнение команды Install-Package
или Update-Package -Reinstall
для пакета, но это не так.
Ответ 2
Это очень распространенная проблема, с которой мы все сталкиваемся. Я создал задачу MSBuild NugetContentRestoreTask, которая поможет вам. Выполните следующую команду в консоли диспетчера пакетов:
Установить Nuget Content Восстановить цели MSBuild
PM> Install-Package MSBuild.NugetContentRestore
Осталось только вызвать его из вашей BeforeBuild
Target примерно так:
Целевые файлы проекта
<Target Name="BeforeBuild">
<NugetContentRestoreTask SolutionDir="$(SolutionDir)" ProjectDir="$(ProjectDir)" />
</Target>
Вы можете взглянуть на исходное хранилище и найти его на nuget.org
.Папки с дополнительным контентом
Этот nuget включает в себя только папки по умолчанию scripts
, images
, fonts
и content
, это не рекурсивный каталог. Для дополнительных подпапок контента - необходимо назначить свойство AdditionalFolders
.
<Target Name="BeforeBuild">
<NugetContentRestoreTask SolutionDir="$(SolutionDir)" ProjectDir="$(ProjectDir)"
AdditionalFolders="less;sass;common" />
</Target>
Ответ 3
Мне тоже не нравится иметь файлы сторонних JavaScript под контролем источника. Вот почему я последовал совету Джеффа Хэндли в http://nuget.codeplex.com/workitem/2094, чтобы создать решение самостоятельно. Я не выполнял исполняемый файл, но создал пакет уровня решения nuget, который делает трюк.
http://www.nuget.org/packages/Baseclass.Contrib.Nuget.GitIgnoreContent/
Он привязан к git, так как он автоматически обновляет файл .gitignore.
Краткое описание:
Игнорировать файлы содержимого nuget в git:
-
Сгенерировать записи в файле .gitignore, чтобы исключить файлы содержимого nuget из исходного репозитория
-
Восстановить файлы содержимого nuget до сборки (автоматически в VS и вручную с помощью powershell script
Я написал сообщение в блоге, описывающее, как его использовать.
http://www.baseclass.ch/blog/Lists/Beitraege/Post.aspx?ID=9&mobile=0
Ответ 4
В Visual Studio 2015 Update 1 они теперь поддерживают contentFiles. Предостережение заключается в том, что он работает только в проектах, которые используют project.json.
В связи с проблемой, с которой вы сталкиваетесь, есть хорошая запись в блоге, которая объясняет, почему вы видите это поведение: Пакет NuGet Восстановление общих заблуждений.
Ответ 5
Уже есть проблема с комментариями разработчиков: http://nuget.codeplex.com/workitem/2094
Ответ 6
Для моих проектов оказалось, что файлы содержимого работают только с PackageReferences
:
- Существующий проект со ссылками на Nuget через
packages.config
- Установленный пакет NuGet с файлами содержимого
- Построить проект
В выходном каталоге нет файлов содержимого
- Преобразование
packages.config
в PackageReferences
- Построить проект
Файлы содержимого были скопированы в выходной каталог
IDE - это Visual Studio 2017. Проект представляет собой проект приложения, что означает, что он находится в старом формате csproj
.