Fazendo check-in de pacotes do NuGet no controle de versão?

87

Antes do NuGet, era comum a 'prática recomendada' fazer o check-in de todas as DLLs externas usadas em um projeto. Normalmente em um diretório Libsou 3rdParty.

Ao trabalhar com o NuGet, devo fazer check-in no packagesdiretório ou há uma maneira de o MSBuild baixar automaticamente os pacotes necessários do feed do nuget?

Scott Weinstein
fonte
2
A resposta para isso é uma questão de opinião. O campo "exclude / No" mantém que, como o conjunto de recursos fornecido torna mais fácil durante o desenvolvimento e a compilação apenas puxar do repositório de pacotes (por exemplo, nuget.org), isso pode ser feito apenas no momento da compilação. O campo "include / Yes" afirma que o código não seria compilado sem os pacotes se o repositório externo se tornasse indisponível. Leia os dois lados antes de tomar uma decisão. Consulte também: softwareengineering.stackexchange.com/questions/301547/…
CJBS

Respostas:

67

Não

Uma vez que esta pergunta foi feita, agora existe um fluxo de trabalho fácil para usar o NuGet sem submeter pacotes ao controle de origem

No console do gerenciador de pacotes, você precisa instalar o 'NuGetPowerTools' :

Install-Package NuGetPowerTools

Em seguida, para habilitar seus projetos para oferecer suporte à restauração de pacote, você precisa executar outro comando:

Enable-PackageRestore

Agora você está pronto para confirmar sua base de código sem a pasta de pacotes. O comando anterior alterou seus arquivos de projeto para que, se os pacotes estiverem ausentes, eles sejam baixados e adicionados automaticamente.

Fonte

Usando NuGet sem submeter pacotes ao controle de origem

Edward Wilde
fonte
41
A partir do NuGet-1.6, você não precisa mais do NuGetPowerTools para fazer isso. Basta clicar com o botão direito do mouse na Solução no Gerenciador de Soluções e escolher Enable NuGet Package Restore,. Veja a documentação .
Kaleb Pederson
3
Sim, você deve verificar a pasta .nuget e os arquivos abaixo dela.
absinto
11
@Edward - Filosoficamente, por que você não incluiria pacotes NuGet no controle de origem, visto que eles são dependências? O que é verificado no controle de origem deve ser 100% do código suficiente para uma compilação. Por não incluir pacotes NuGet, existem dependências externas criadas, por exemplo. e se o local de download do pacote mudar ou, por algum motivo estranho, não estiver mais disponível, etc. Ou, mais provavelmente, se houver alguma ligeira alteração no pacote que é baixado novamente e interrompe a compilação? Isso teria sido evitado se tudo o que fosse necessário para construir o projeto estivesse no controle de origem.
Howiecamp
5
@Howiecamp eu não poderia concordar mais. Eu não entendo a lógica. Quero que o controle de origem seja um sistema totalmente independente. Especialmente se o projeto for um tanto legado e não for acessado por um tempo. Quero voltar e fazer com que funcione sem modificações. Nuget é um ponto único de falha que não quero ter.
Telavian
2
@Howiecamp Nossa solução é hospedar nosso próprio servidor nuget - e colocar todos os pacotes nuget, internos como externos, no GIT-LFS. Isso remove o ponto único de falha e mantém tudo sob controle de versão. Mas ainda não verificamos a pasta de pacotes - e ainda usamos a restauração automática de pacotes
Casper Leon Nielsen
31

Sim. Considere o diretório "packages" equivalente ao diretório "libs" que você mencionou em sua pergunta. Esta é a abordagem que eu pessoalmente adoto com meus projetos de OSS.

Estamos investigando recursos que permitiriam ao MSBuild fazer download automático dos pacotes necessários, mas que não foram implementados (a partir do NuGet 1.1).

Acho que algumas pessoas já podem ter implementado esses recursos por conta própria, mas nosso plano é ter esse recurso integrado ao NuGet 1.2 ou 1.3, com sorte.

Haacked
fonte
10
Eu definitivamente gostaria de ver esse recurso adicionado. Seria bom poder ter os pacotes baixados conforme necessário para um servidor de CI ou PC de desenvolvimento, para que você possa evitar o inchaço do repositório de controle de origem com DLLs de terceiros.
GiddyUpHorsey
2
Se o gerenciador de pacotes no Visual Studio e a ferramenta de linha de comando pudessem "reparar Pacotes", isso seria incrível.
Shaun Wilson
1
Talvez seja bom remover / editar esta resposta agora que está obsoleta
Lex
3
A resposta do @Tim não é imho atual
Edward Wilde
4
Esta resposta ainda é atual. Considere os pacotes que não estão no repositório global (não há como consertá-los / baixá-los). IMHO, é uma boa prática armazenar pacotes no sistema de controle de versão.
Pavel Hodek
6

Apesar de todas as respostas aqui, ainda é uma solução horrível e simples não ter todas as suas dependências sob "algum tipo" de controle de versão.

Para GIT, isso significaria GIT-LFS.

O episódio recente com o NPM mostra por quê: se o repositório da Internet do qual você depende quebrar, não estiver disponível, etc., então você está ferrado, não é?

Você não é mais capaz de construir suas coisas - e, portanto, não é capaz de entregar.

Casper Leon Nielsen
fonte
1
Esse é um ponto muito bom. Mesmo se tivermos nosso próprio servidor NuGet interno, podemos confiar que ele estará sempre disponível durante a compilação? Além disso, com que frequência nossos pacotes mudam de modo que sempre precisaríamos obter uma nova cópia para cada construção?
Josh P de
npmquebrou porque não removeu os pacotes da lista, na verdade os excluiu. NuGet não faz isso; se em algum ponto você não conseguir acessar o NuGet, algo está terrivelmente errado. Não acho que armazenar um craptonne de dependências no git seja uma boa solução: apenas bloqueie suas dependências para uma versão específica e tenha um espelho entre você e a internet se isso for importante para você.
Dan Pantry
2
"NuGet não faz isso". Bem, hudiluhu, você acabou de fazer promessas para o futuro de um domínio que está completamente fora de seu controle. No mundo real, as coisas estão fora de sua área de controle, bem, elas estão fora de sua área de controle. Isso vale para NuGet, bem como Npm. Além disso, sua idéia de um "espelho" é exatamente o que proponho aqui, mas em seu mundo o "espelho" não é apoiado por nenhum tipo de esquema de versão controlada. Mais uma vez, você não resolveu o problema a que se propôs.
Casper Leon Nielsen
5

Desde que fiz a pergunta, coloquei a seguinte abordagem para não ter que verificar no diretório Toplovel Packages .

Em um arquivo build.msbuild de nível superior:

<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>

Em cada arquivo 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>
Scott Weinstein
fonte
2
Isso funciona, mas atualmente é melhor usar apenas a restauração de pacote de habilitação integrada
Scott Weinstein
4

Sei que a realidade era diferente quando esta pergunta foi postada e respondida originalmente, mas felizmente a resposta mudou um pouco. Agora é possível usar o NuGet para baixar dependências por meio do MSBuild usando um evento Pre-Build. Você não precisa colocar a pasta de pacotes em seu repositório de código, todas as dependências serão baixadas e / ou atualizadas no build. Pode ser uma solução alternativa, mas parece decente o suficiente. Consulte a seguinte postagem do blog para obter detalhes: http://blog.davidebbo.com/2011/03/using-nuget-without-committing-packages.html

Pawel Krakowiak
fonte
4
Fiquei animado até lembrar que isso requer que o servidor de compilação acesse o repositório NuGet, e este não é o único lugar em que trabalhei onde os servidores de compilação não podem ver a Internet. Vou apenas voltar a verificar a árvore de pacotes em ...
piers7
3

A partir de 20/09/13, existe algo chamado "Restauração Nuget". Na verdade, você não precisa fazer o check-in da pasta do pacote se desejar. (Especialmente se você estiver usando DVCS)

Verifique isto: Usando NuGet sem confirmar pacotes para o controle de origem http://docs.nuget.org/docs/workflows/using-nuget-without-committing-packages

Matt W
fonte
3

Esta postagem está muito desatualizada. A resposta ainda é NÃO, mas a solução mudou. A partir do NuGet 2.7+, você pode habilitar a restauração automática de pacotes sem incluir o arquivo NuGet.exe em sua origem (isso é indesejável para dizer o mínimo) e se você usar qualquer DVCS moderno, pode ignorar a pasta de pacotes. Se você precisar de qualquer personalização especial, pode criar um arquivo nuget.config na raiz da solução.

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

Além disso, com o novo formato csproj, você pode evitar os arquivos nuget.config extras, já que agora está integrado. Confira esta postagem que explica isso melhor:

A pasta .nuget deve ser adicionada ao controle de versão?

Jeremy
fonte