it-swarm-ru.tech

Проверять пакеты из NuGet в систему контроля версий?

До NuGet общепринятая "лучшая практика" заключалась в регистрации всех внешних библиотек DLL, используемых в проекте. Обычно в каталоге Libs или 3rdParty.

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

87
Scott Weinstein

Задав вопрос, я применил следующий подход, чтобы мне не приходилось проверять каталог toplovel Packages.

В верхнем уровне файла build.msbuild:

<Target Name="NuGet">
    <ItemGroup>
       <NuGetPackage Include="*\packages.config" />
    </ItemGroup>
    <Exec Command='libs\NuGet.exe install "%(NuGetPackage.FullPath)" -o Packages'  />

    <!-- optional for project that has JavaScript content -->
    <CreateItem Include="Packages\*\Content\Scripts\*">
       <Output TaskParameter="Include" ItemName="NuGetJSFiles"/>
    </CreateItem>
    <Copy SourceFiles="@(NuGetJSFiles)" DestinationFolder="MainProj\Scripts\" OverwriteReadOnlyFiles="true" SkipUnchngedFiles="true" />
    <Delete Files="MainProj\Scripts\.gitignore" />
    <WriteLinesToFile File="MainProj\Scripts\.gitignore" Lines="%(NuGetJSFiles.Filename)%(NuGetJSFiles.Extension)" /
    <Delete Files="@(PostNuGetFiles)" />
</Target>

В каждом файле project.csproj

<Target Name="BeforeBuild">
    <Error Condition="!Exists('..\Packages\')" Text="You must run &gt; msbuild build.msbuild to download required NuGet
Packages" />

    <!-- optional for project that has JavaScript content -->
   <ReadLinesFromFile File="Scripts\.gitignore">
     <Output TaskParameter="Lines" ItemName="ReqJSFiles" />
   </ReadLinesFromFile>
   <Message Text="@(ReqJSFiles)" />
   <Error Condition="!Exists('Scripts\%(ReqJSFiles.Identity)')" Text="You must run &gt; msbuild build.msbuild to download required NuGet JS Package - Scripts\%(ReqJSFiles.Identity)" />
 </Target>
5
Scott Weinstein

Нет

Поскольку этот вопрос был задан, теперь существует простой рабочий процесс для использования NuGet без передачи пакетов в систему контроля версий.

В консоли диспетчера пакетов вам необходимо установить NuGetPowerTools :

Install-Package NuGetPowerTools

Затем, чтобы ваши проекты могли поддерживать восстановление пакетов, вам нужно выполнить другую команду:

Enable-PackageRestore

Теперь вы готовы зафиксировать свою кодовую базу без папки пакетов. Предыдущая команда изменила файлы вашего проекта, так что если пакеты отсутствуют, они автоматически загружаются и добавляются.

Источник

Использование NuGet без передачи пакетов в систему контроля версий

67
Edward Wilde

Да. Считайте, что каталог "packages" эквивалентен каталогу "libs", который вы упомянули в своем вопросе. Это подход, который я лично использую в своих проектах OSS.

Мы исследуем функции, которые позволят MSBuild автоматически загружать необходимые пакеты, но это не было реализовано (начиная с NuGet 1.1).

Я думаю, что некоторые люди, возможно, уже внедрили такие функции самостоятельно, но мы надеемся, что эта функция будет встроена в NuGet 1.2 или 1.3.

30
Haacked

Несмотря на все ответы здесь, это по-прежнему ужасное решение, когда не все ваши зависимости находятся под "своего рода" контролем версий.

Для GIT это будет означать GIT-LFS.

Недавний эпизод с NPM показывает, почему: если интернет-хранилище, от которого вы зависите, прерывается, недоступно и т.д., То что ж, вы облажались?

Вы больше не можете создавать свои вещи - и, следовательно, не можете доставить.

6
Casper Leon Nielsen

Я понимаю, что реальность была иной, когда этот вопрос был первоначально опубликован и на него был дан ответ, но, к счастью, ответ немного изменился. Теперь можно использовать NuGet для загрузки зависимостей через MSBuild с помощью события Pre-Build. Вам не нужно помещать папку пакетов в ваш репозиторий кода, все зависимости будут загружены и/или обновлены при сборке. Это может быть обходной путь, но выглядит достаточно прилично. Подробности см. В следующем сообщении в блоге: http://blog.davidebbo.com/2011/03/using-nuget-without-committing-packages.html

4
Pawel Krakowiak

Этот пост сильно устарел. Ответ все еще НЕТ, но решение изменилось. Начиная с NuGet 2.7+, вы можете включить автоматическое восстановление пакетов, не добавляя файл NuGet.exe в ваш источник (это нежелательно, если не сказать больше), и если вы используете какой-либо современный DVCS, вы можете игнорировать папку пакетов. Если вам нужны какие-либо специальные настройки, вы можете создать файл nuget.config в корне решения.

http://docs.nuget.org/docs/reference/package-restore

Кроме того, с новым форматом csproj вы можете избежать лишних файлов nuget.config, так как они теперь интегрированы. Пожалуйста, проверьте этот пост, который объясняет это лучше:

Нужно ли добавлять папку .nuget в систему управления версиями?

3
Jeremy

Начиная с 20.09.13, существует нечто, называемое "Nuget Restore". Вам на самом деле не нужно проверять в папке пакета, если вы хотите это сделать. (Особенно если вы используете DVCS)

Проверьте это: использование NuGet без передачи пакетов в систему контроля версий http://docs.nuget.org/docs/workflows/using-nuget-without-committing-packages

3
Matt W