Consiga que o TFS ignore minha pasta de pacotes

332

Estou tentando fazer com que o TFS (2013) ignore minha packagespasta. Eu apaixonadamente não quero que a fonte seja controlada, pois estou usando o NuGet e é ótimo!

Tentei camuflar (parece não funcionar), tentei adicionar .tfignorearquivos - nada é ignorado. Por que a equipe do TFS não adiciona uma opção para ignorar permanentemente uma pasta ou arquivo como muitos clientes do Subversion fazem ?!

Matt
fonte
Quais versões do TFS e Visual studio você está usando? Você está usando áreas de trabalho locais ou de servidor?
James Reed
É um bug do NuGet, aparentemente: docs.nuget.org/docs/reference/package-restore-with-team-build
user2864740
possível duplicata de tfIgnore não funciona para mim no Visual Studio 2013
Edward Brey
1
Você deve alterar a resposta sobre esta questão
Chris Marisic
3
Se você estiver usando o NuGet, a pasta packages é necessária. Você pode configurar o NuGet para restaurar os binários ausentes na compilação (para que você controle a origem da pasta packages, mas ignore os binários). - Mas há problemas com isso: é possível que um binário do NuGet seja atualizado (sem que o número da versão seja alterado) ou removido, etc. - É possível que todo tipo de estranheza ocorra. Não deixe suas construções ao acaso - verifique toda a pasta de pacotes. Você economizará muitas dores de cabeça.
precisa saber é o seguinte

Respostas:

497

Aqui está o acordo: temos que dizer ao NuGet e ao TFS para ignorar os pacotes, porque o NuGet está tentando fazer coisas relacionadas ao controle de origem que absolutamente não deveriam estar fazendo (má forma, Microsoft!). Então você tem que fazer duas coisas.

Primeiro, adicione um arquivo nomeado .tfignoreà pasta da solução (observe a falta de sapós o tf). Seu conteúdo deve ser o seguinte:

\packages

Isso diz ao TFS para ignorar sua pasta de pacotes. Agora, você pensaria que isso também ignoraria o repositories.configarquivo. Mas não vai. Por quê? Quem sabe, os caminhos da Microsoft são estranhos e misteriosos. Na verdade, acho que faz parte do material do NuGet que descrevi abaixo, mas se isso for corrigido no futuro e você quiser manter o repositories.configarquivo em vez de permitir que o VS o regenere, você poderá usá-lo:

\packages
!\packages\repositories.config

OK, agora, graças ao nosso .tfignorearquivo, o TFS está ignorando seus pacotes. Está tudo bem, certo? ERRADO , porque o NuGet está mexendo com seu controle de origem e adicionando os pacotes às alterações pendentes. Então agora vamos dizer ao NuGet para cortá-lo já.

Crie uma pasta chamada .nugetna raiz da pasta da solução. 1 Agora, crie um arquivo chamado NuGet.confige coloque-o nesta nova pasta 2 . Seu conteúdo deve ficar assim:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <solution>
    <add key="disableSourceControlIntegration" value="true" />
  </solution>
</configuration>

E agora seus pacotes devem ficar fora do controle de origem. Lembre-se de adicionar os arquivos NuGet.confige .tfignoreao controle de origem para que nunca se percam.

EDIT: Se você estiver tendo problemas, convém excluir a pasta de pacotes, fazer o check-in dessa alteração e seguir as etapas acima.

EDITAR TAMBÉM: Parece que isso não acontecerá nas versões mais recentes do Nuget. Portanto, talvez se você mudar para o VS / TFS 2017, esse problema será resolvido sem passar pelos aros acima.

1 . Adicione a pasta usando o Source Control Explorer; clique com o botão direito do mouse na solução-> Adicionar pasta ->. nuget
2 . Quando descobri isso usando o VS 2013, descobri que o NuGet.config tinha que ir na pasta .nuget. Mesmo se você já tiver um arquivo NuGet.config na raiz da pasta da solução (porque, digamos, sua empresa possui um feed de pepitas interno). No entanto, alguns comentários indicaram que ele funciona bem na raiz da solução no VS 2015. Pessoalmente, mudei para o uso do TFS no modo git, por isso não posso testar. Além disso, se você possui um feed personalizado, verifique se possui o feed personalizado e o nuget.org como chaves no arquivo Nuget.config, ou às vezes o TFS decide aleatoriamente que não pode restaurar os pacotes.

Pharylon
fonte
1
Acredito que isso requer pelo menos o TFS 2012. stackoverflow.com/questions/14365929/…
ClearCloud8
2
@zespri Que arquivo está com uma exclusão pendente? O pacote NuGet? Isso não deve estar com uma exclusão pendente ... deve ser excluído! Depois de fazer o que sugeri acima, vá para o Team Explorer e exclua todos os pacotes Nuget que já podem estar no controle de origem. Ou simplesmente exclua a pasta packages completamente. Estive rolando com essa configuração há meses e nunca tive esse erro.
Pharylon
5
No VS2015, nuget.config não precisa estar dentro de /.nuget/. Funciona muito bem na raiz da solução.
Jnm2
141
Para quem quiser saber como criar uma pasta e um arquivo que inicie com um ponto final, termine o nome com outro ponto. Então isso seria .tfignore. e .nuget.
Derek Ziemba
16
@DerekZiemba Neat trick! Eu venho fazendo isso através da linha de comando todos esses anos. Acho que vale a pena mencionar que, quando você faz isso, o final '.' será removido, inicialmente pensei que sua sugestão era viver apenas com um 'extra'. no fim.
53

Uma solução alternativa para o acima é o seguinte.

  • Adicione a pasta packages ao TFS (sem nenhum arquivo ou subpasta)
  • Clique com o botão direito do mouse na pasta Pacotes
  • Clique esquerdo Avançado
  • Cloak Cloak

Vale ressaltar que essa solução precisaria ser aplicada por espaço de trabalho do TFS. Funcionou muito mais confiável para mim do que usando o .tfignorearquivo.

Você pode ler mais sobre essa abordagem no artigo do blog Impedir que o TFS adicione pacotes NuGet instalados no controle de origem .

Ryan Gates
fonte
23

para pessoas que relatam que a opção .tfignore não estava funcionando com a configuração nuget.config, pode ser interessante - essas etapas finalmente funcionaram para mim:

  1. Excluir tudo na minha pasta de pacotes
  2. Verifique se o TFS não possui alterações pendentes nessa pasta pendentes
  3. Fechar VS
  4. Abra novamente o VS e recarregue a solução - usando a restauração Nuget para preencher novamente os pacotes. Observação: não há alterações pendentes no controle de origem do TFS
Adam Stewart
fonte
3
Isso funcionou para mim depois de aplicar a solução Pharylon, o que fiz após restaurar os pacotes.
user849924
1
Realmente útil, devemos fazer isso para o horário inicial (primeiro envio do arquivo .tfignore para o TFS), mas não para todos. se eu estiver correto.
RajeshKdev
Eu acho que essa abordagem funcionará apenas na máquina que faz a capa. Estou certo? portanto, isso não resolve o problema raiz de todos os membros da equipe.
PANOx
Uma variação disso funcionou para mim - eu assegurei que nada dos Pacotes já havia sido confirmado e excluí o diretório de pacotes do disco. Nesse momento, ele ainda estava sendo exibido como alterações pendentes no VS team explorer, então escolhi Desfazer as alterações pendentes no diretório de pacotes. Este limpa-lo (sem mim a necessidade de fechar / reabrir), e eles não vão voltar =)
frax
8

Adicione um arquivo nuget.config em uma pasta .nuget na sua solução. Adicione o seguinte ao arquivo nuget.config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <solution>
    <add key="disableSourceControlIntegration" value="true" />
  </solution>
</configuration>

O disableSourceControlIntegration é o que faz o truque para o Controle de versão do TFS.

Terje Sandstrøm
fonte
Não tem efeito - também não é uma solução global.
Jaster
@ Muitos Goblins: Você já tentou isso em um projeto / sln completamente novo? (Apenas para checar) Estou curioso para saber o que na sua configuração faz com que isso não funcione, pois funciona toda vez que eu mesmo faço isso, e é a maneira recomendada de fazer isso com o TFS / nuget. Além disso, em qual versão do VS / TFS você vê isso?
Terje Sandstrøm
Visual studio 2013. Nova solução, sim. Eu resolvi esse problema adicionando um .tfignore ignorando explicitamente cada pacote.
Muitos duendes
2
Ok, é efetivamente o que "Ativar restauração do pacote NuGet" faz. Apenas feche e abra novamente sua solução! O arquivo NuGet.config é lido apenas ao abrir sua solução.
Heliac 24/03
Isso não funcionou para mim no visual studio online e no VS2013. Usei a solução Right Click> Ativar restauração de pacotes NuGet. Isso adicionará o arquivo Nuget.config à raiz da solução Adicione o .tfignore. Normalmente, faço isso adicionando um arquivo de texto à raiz da solução, permitindo que ele detecte isso e exclua clicando em 'detecção detectada'> clique com o botão direito do mouse em ignorar. Em seguida, faça o check-in de tudo, incluindo todos os pacotes. Em seguida, exclua todos os pacotes da sua solução e faça o check-in dessa alteração (isso removerá os pacotes do TFS). Abra a solução e construa o que adicionará os pacotes, mas o TFS não os buscará.
David Wilton
7

Você precisa usar áreas de trabalho locais para .tfignoretrabalhar. O .tfignorearquivo deve estar na pasta que contém os arquivos ou pastas que você deseja ignorar.

Portanto, se a estrutura da sua solução estiver assim:

\Project
   \Packages
   \OtherStuff
   foo.cs

Você colocaria o arquivo .tfignore em \ Project:

\Project
   \Packages
   \OtherStuff
   foo.cs
   .tfignore

O conteúdo do .tfignore no seu caso seria:

\packages

Aqui está uma documentação para você: http://msdn.microsoft.com/library/vstudio/ms245454(v=vs.110).aspx#tfignore

Daniel Mann
fonte
2
Adicionei os arquivos .tfignore e, quando crio o projeto, ele ainda está tentando adicionar pacotes ao tfs. Parece pouco que eu possa fazer para impedir isso.
Matt
Você pode postar o arquivo ignorar que você adicionou?
MrHinsh - Martin Hinshelwood
2
Consulte docs.nuget.org/docs/reference/package-restore-with-team-build - é um bug do NuGet com .tfignore, mas pode ser corrigido com o NuGet para se esforçar para a integração do SCM.
user2864740
1
Parece que seu exemplo pode estar errado, e deve ser em packagesvez de \packagesrelativo.
Martin Martin
6

Você pode defini-lo permanentemente AppData\Roamingpara todas as soluções (antigas e novas)!

No seu %AppData%\NuGet\NuGet.Configarquivo, adicione o seguinte antes da </configuration>tag XML ...

<config>
  <add key="repositoryPath" value="C:\NuGetPackages" />
</config>
<solution>
  <add key="disableSourceControlIntegration" value="true" />
</solution>

... você pode especificar qualquer caminho que desejar - o importante é colocá-lo fora do seu espaço de trabalho do TFS!

Agora você nunca precisa se preocupar com essas coisas novamente. A pasta da solução não conterá mais nenhum pacote; todas as soluções usarão como padrão o local dos pacotes personalizados.

NOTA - Isso funciona por usuário.

Heliac
fonte
1
Parece bom e possivelmente muito mais simples. Você precisa aplicar essa configuração em toda a sua equipe e, principalmente, no login / configuração dos servidores de compilação, se você seguir essa abordagem?
Chris F Carroll
Eu imagino que sim. Não testei este WRT construir servidores, desculpe. Eu também imaginaria que caminhos de pastas diferentes para as pastas lib poderiam causar problemas (acho que alguns pacotes do NuGet têm referências concretas aos caminhos da lib, se bem me lembro).
Heliac
2

Defina sua solução para restaurar na compilação, a pasta e o arquivo de pacotes serão verificados, mas os pacotes não.

Apenas TFS
fonte
1
Por favor, explique "restaurar na compilação".
user2864740
10
A funcionalidade "ativar a restauração do pacote NuGet" com o botão direito do mouse do Visual Studio foi preterida, já que o NuGet 2.7 - TFS 2013 suporta nativamente a restauração de pacotes NuGet sem o arquivo NuGet.targets e modificações nos arquivos do proj.
Daniel Mann
1

Se você estiver usando o Git com TFS, precisará adicionar um arquivo ".gitignore". Você pode fazer isso em "projeto de equipe | Configurações | 'adicionar arquivo ignorar'". Em seguida, abra o arquivo e remova o comentário da instrução ignorar interna para pacotes Nuget.

Se você estiver usando TFVC e tiver Espaços de Trabalho Locais configurados, poderá usar o arquivo ".tfignore" que respeita um formato idêntico ao arquivo Git. Eu acho que você precisa de "pacotes /".

MrHinsh - Martin Hinshelwood
fonte
nós usamos o TFSVC e, como já mencionado na postagem inicial - o arquivo .tfignore não está funcionando.
Jaster
Como afirmei, você precisa usar o formato correto de .tfignore. Eu acredito que você tem a barra da maneira errada
MrHinsh - Martin Hinshelwood 30/10
@MrHinsh depois de falar com Ed Thompson, o arquivo .tfignore não funciona corretamente. O .gitignore faz embora.
DaveShaw
@Ed precisa ir consertar isso;)
MrHinsh - Martin Hinshelwood 8/14
1

Isso não funcionou para mim no visual studio online e no VS2013.

  • Clique com o botão direito do mouse em Solução> Ativar Restauração de Pacotes NuGet. Isso adicionará o arquivo Nuget.config à solução

insira a descrição da imagem aqui

  • Adicione o .tfignore. Normalmente, faço isso adicionando um arquivo de texto à raiz da solução, permitindo que ele detecte isso e exclua clicando em 'detecção detectada'> clique com o botão direito do mouse em ignorar.

insira a descrição da imagem aqui

  • Adicione os pacotes ao .tfignore e diga para incluir repositories.config

insira a descrição da imagem aqui

Dos outros comentários, parece que sua milhagem pode variar nesse momento. Isto é o que eu faço:

  • Verifique tudo, incluindo todos os pacotes.

  • Exclua todos os pacotes da sua solução e verifique esta alteração (isso removerá os pacotes do TFS)

  • Abra a solução e crie que adicionará os pacotes ao projeto, mas o TFS não os buscará.

David Wilton
fonte
2
Primeiro, a opção Ativar restauração do Nuget foi descontinuada e não existe no VS 2015, se você seguir esse caminho mais tarde. Segundo: a verificação de pacotes e dlls os adicionará ao controle de origem, excluindo-os na solução e verificando se NÃO os removerá do SC, apenas na ponta do seu ramo. -
Terje Sandstrøm
1
@ TerjeSandstrøm, mas a pergunta é específica para 2013. Sim, você está certo, você teria que usar tf destroy para removê-lo permanentemente do controle de origem, mas não encontrei outra maneira de fazer o TFS aderir ao arquivo .tfignore
David Wilton
1

A solução que funcionou para mim foi criar um .tfignore e a seguinte configuração no Nuget.Config:

<configuration>
  ...
  <solution>
    <add key="disableSourceControlIntegration" value="true" />
  </solution>  
  ...
</configuration>

Meu .tfignore contém esta linha:

\packages

[Estou usando o Visual Studio 2015 Update 2]

Isso não é o ideal e está atualmente registrado como um problema em aberto no github / nuget:

Facilite a omissão de pacotes do TFVC # 493

redcalx
fonte
0

A resposta de Terje não funciona o tempo todo para mim, às vezes funcionará por um tempo, mas depois pendurará uma carga de "acrescentos" para mim novamente.

A única maneira que encontrei para resolver isso permanentemente é ocultar a pasta packages no meu espaço de trabalho.

Por exemplo:

Type      Server                Local
============================================
Active    $/Work/Main           C:\Code\Main
Cloaked   $/Work/Main/Packages
DaveShaw
fonte
Isso foi muito estranho. Isso acontece com as versões mais recentes do Visual Studio e NuGet?
Terje Sandstrøm
Sim, eu executo o VS 2013.4 e o NuGet 2.8 nos espaços de trabalho locais do TFS 2012.
DaveShaw
Você precisa ocultar TODAS as pastas de pacotes para fazer dúzias de projetos e poluções. Também cada membro da equipe tem que repetir o procedimento para cada espaço de trabalho
Jaster
O manto não é uma boa resposta e as duas outras respostas acima funcionam e são projetadas. Deve haver algo mais acontecendo no seu ambiente.
MrHinsh - Martin Hinshelwood
@ MrHinsh - várias pessoas no departamento analisaram isso e está quebrado. Parece bom no Git, mas ao usar o TFVC, ele faz isso o tempo todo.
DaveShaw
0

Eu tive o mesmo problema. /packagesdeve funcionar, mas não funcionou para mim. packages*.*funcionou.

coding4fun
fonte