Подтвердить что ты не робот

Файлы пакета 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?

4b9b3361

Ответ 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 Восстановление общих заблуждений.

Ответ 6

Для моих проектов оказалось, что файлы содержимого работают только с PackageReferences:

  1. Существующий проект со ссылками на Nuget через packages.config
  2. Установленный пакет NuGet с файлами содержимого
  3. Построить проект
  4. В выходном каталоге нет файлов содержимого

  5. Преобразование packages.config в PackageReferences
  6. Построить проект
  7. Файлы содержимого были скопированы в выходной каталог

IDE - это Visual Studio 2017. Проект представляет собой проект приложения, что означает, что он находится в старом формате csproj.