Obtener TFS para ignorar mi carpeta de paquetes

332

Estoy intentando que TFS (2013) ignore mi packagescarpeta. ¡No quiero que su fuente sea controlada ya que estoy usando NuGet y es genial!

He intentado encubrir (no parece funcionar), he intentado agregar .tfignorearchivos, no se ignora nada. ¿Por qué el equipo de TFS no agrega una opción para ignorar permanentemente una carpeta o archivo como hacen muchos clientes de Subversion?

Mate
fuente
¿Qué versiones de TFS y Visual Studio estás usando? ¿Está utilizando espacios de trabajo locales o de servidor?
James Reed
Es un error de NuGet, aparentemente: docs.nuget.org/docs/reference/package-restore-with-team-build
user2864740
posible duplicado de tfIgnore no me funciona en Visual Studio 2013
Edward Brey
1
Debería cambiar la respuesta a esta pregunta
Chris Marisic
3
Si está utilizando NuGet, se requiere la carpeta de paquetes. Sin embargo, puede configurar NuGet para restaurar los archivos binarios que faltan en la compilación (para que controle la carpeta de paquetes, pero ignore los archivos binarios). - Pero hay problemas con eso: es posible que un binario NuGet se actualice (sin que cambie el número de versión), o que se elimine, etc. - Es posible que ocurran todo tipo de rarezas extrañas. No deje sus compilaciones al azar: consulte la carpeta de paquetes completa. Te ahorrarás muchos dolores de cabeza.
BrainSlugs83

Respuestas:

497

Aquí está el trato: tenemos que decirle a NuGet y TFS que ignoren los paquetes, porque NuGet está tratando de hacer cosas relacionadas con el control de origen que no deberían estar haciendo (¡mal, Microsoft!). Entonces tienes que hacer dos cosas.

Primero, agregue un archivo con nombre .tfignorea la carpeta de la solución (tenga en cuenta la falta de sdespués de tf). Su contenido debe ser el siguiente:

\packages

Eso le dice a TFS que ignore su carpeta de paquetes. Ahora, pensaría que esto también ignoraría el repositories.configarchivo. Pero no lo hará. ¿Por qué? Quién sabe, los caminos de Microsoft son extraños y misteriosos. En realidad, creo que es parte de las cosas de NuGet que describo a continuación, pero si eso se soluciona en el futuro y desea mantener el repositories.configarchivo en lugar de permitir que VS lo regenere, debería poder usar esto:

\packages
!\packages\repositories.config

Bien, ahora gracias a nuestro .tfignorearchivo, TFS está ignorando sus paquetes. Todo está bien, ¿verdad? Incorrecto , porque NuGet está jugando con su control de origen y está agregando los paquetes a sus cambios pendientes. Así que ahora digamos a NuGet que ya lo corte.

Cree una carpeta llamada .nugeten la raíz de su carpeta de solución. 1 Ahora, cree un archivo llamado NuGet.configy póngalo en esta nueva carpeta 2 . Su contenido debería verse así:

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

Y ahora sus paquetes deben estar fuera del control de la fuente. Solo recuerde agregar los archivos NuGet.configy .tfignoreal control de origen para que nunca se pierdan.

EDITAR: si tiene problemas, es posible que desee eliminar la carpeta de paquetes, verifique ese cambio y luego siga los pasos anteriores.

TAMBIÉN EDITAR: Parece que esto no sucederá con las versiones más nuevas de Nuget. Entonces, si cambia a VS / TFS 2017, este problema se solucionará sin saltar a través de los aros anteriores.

1 . Agregue la carpeta usando Source Control Explorer; Haga clic con el botón derecho en la solución-> Agregar carpeta ->. nuget
2 . Cuando descubrí esto usando VS 2013, encontré que NuGet.config tenía que ir en la carpeta .nuget. Incluso si ya tiene un archivo NuGet.config en la raíz de la carpeta de su solución (porque, por ejemplo, su empresa tiene una fuente Nuget interna). Sin embargo, algunos de los comentarios han indicado que funciona bien en la raíz de la solución en VS 2015. Personalmente, cambié a usar TFS en modo git, por lo que no puedo probar. Además, si tiene un feed personalizado, asegúrese de tener el feed personalizado y nuget.org como claves en el archivo Nuget.config, o en ocasiones TFS decidirá al azar que no puede restaurar los paquetes.

Pharylon
fuente
1
Creo que esto requiere TFS 2012 al menos. stackoverflow.com/questions/14365929/…
ClearCloud8
2
@zespri ¿Qué archivo está pendiente de eliminación? El paquete NuGet? Eso no debería estar pendiente de una eliminación ... ¡debería eliminarse! Después de hacer lo que sugerí anteriormente, vaya a Team Explorer y elimine todos los paquetes de Nuget que ya podrían estar en el control de origen. O simplemente elimine la carpeta de paquetes por completo. He estado trabajando con esta configuración durante meses y nunca experimenté ese error.
Pharylon
55
Para su información en VS2015, nuget.config no tiene que estar dentro de /.nuget/. Funciona muy bien en la raíz de la solución.
jnm2
141
Para cualquiera que se pregunte cómo crear una carpeta y un archivo que comience con un punto, finalice el nombre con otro punto. Entonces eso sería .tfignore. y .nuget.
Derek Ziemba
16
@DerekZiemba ¡Buen truco! Lo he estado haciendo a través de la línea de comando todos estos años. Creo que vale la pena mencionar que cuando haces eso, el final ''. será eliminado, inicialmente pensé que su sugerencia era simplemente vivir con un '.' al final.
53

Una solución alternativa a lo anterior es la siguiente.

  • Agregue la carpeta de paquetes a TFS (sin ningún archivo o subcarpeta)
  • Haga clic derecho en la carpeta de paquetes
  • Clic izquierdo avanzado
  • Haga clic en capa

Vale la pena señalar que esta solución debería aplicarse por espacio de trabajo TFS. Me ha funcionado de manera mucho más confiable en lugar de usar el .tfignorearchivo.

Puede leer más sobre este enfoque en el artículo del blog Evite que TFS agregue paquetes NuGet instalados al control de origen .

Ryan Gates
fuente
23

para las personas que informan que la opción .tfignore no funcionaba con la configuración nuget.config podría ser de interés, estos pasos finalmente me funcionaron:

  1. Eliminar todo en mi carpeta de paquetes
  2. Asegúrese de que TFS no tenga cambios pendientes en esa carpeta
  3. Cerrar VS
  4. Vuelva a abrir VS y recargue la solución: use la restauración de Nuget para volver a llenar los paquetes. Tenga en cuenta que no hay cambios pendientes para el control de origen TFS
Adam Stewart
fuente
3
Esto funcionó para mí después de aplicar la solución de Pharylon, que hice después de restaurar los paquetes.
user849924
1
Realmente útil, debemos hacer esto por tiempo inicial (primer compromiso del archivo .tfignore en el TFS), pero no todos. si estoy en lo correcto
RajeshKdev
Creo que este enfoque solo funcionará en la máquina que hace la capa. Estoy en lo cierto? así que esto no resuelve el problema raíz para todos los miembros del equipo.
panox
Una variación de esto funcionó para mí: me aseguré de que nada de los paquetes ya se hubiera confirmado, luego eliminé el directorio de paquetes del disco. En este punto, todavía se mostraba como cambios pendientes en el explorador del equipo VS, por lo que elegí Deshacer los cambios que estaban pendientes en el directorio de paquetes. Esto lo limpió (sin que yo necesite cerrar / volver a abrir), y no volverán =)
frax
8

Agregue un archivo nuget.config en una carpeta .nuget en su solución. Agregue lo siguiente al archivo nuget.config:

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

DisableSourceControlIntegration es lo que hace el truco para el Control de versiones de TFS.

Terje Sandstrøm
fuente
No tiene ningún efecto, tampoco es una solución global.
Jaster
@ Muchos Goblins: ¿Has probado esto en un proyecto / sln completamente nuevo? (Solo por comprobarlo) Tengo curiosidad por saber qué hace que esto no funcione, ya que funciona cada vez que lo hago yo mismo, y es la forma recomendada de hacerlo con TFS / nuget. Además, ¿en qué versión de VS / TFS ves esto?
Terje Sandstrøm
Visual studio 2013. Nueva solución, sí. Resolví este problema agregando un .tfignore ignorando explícitamente cada paquete.
Tantos duendes
2
Bien, esto es efectivamente lo que hace "Habilitar la restauración del paquete NuGet". ¡Solo asegúrese de CERRAR y volver a abrir su solución! El archivo NuGet.config solo se lee al abrir la solución.
Heliac
Esto no funcionó para mí en Visual Studio en línea y VS2013. Usé la solución de clic derecho> Habilitar la restauración del paquete NuGet. Esto agregará el archivo Nuget.config a la raíz de la solución Agregue el .tfignore. Normalmente hago esto agregando un archivo de texto a la raíz de la solución, dejándolo detectar y luego excluyendo haciendo clic en 'agregar agregado'> haga clic derecho en ignorar. Luego, registre todo, incluidos los paquetes. Luego elimine todos los paquetes de su solución y registre este cambio (esto eliminará los paquetes de TFS). Abra la solución y compile lo que agregará los paquetes, pero TFS no los recogerá.
David Wilton
7

Debe estar utilizando espacios de trabajo locales para .tfignoretrabajar. El .tfignorearchivo debe estar en la carpeta que contiene los archivos o carpetas que desea ignorar.

Entonces, si la estructura de su solución se ve así:

\Project
   \Packages
   \OtherStuff
   foo.cs

Pondría su archivo .tfignore en \ Project:

\Project
   \Packages
   \OtherStuff
   foo.cs
   .tfignore

El contenido de .tfignore en su caso sería:

\packages

Aquí hay documentación para usted: http://msdn.microsoft.com/library/vstudio/ms245454(v=vs.110).aspx#tfignore

Daniel Mann
fuente
2
Agregué los archivos .tfignore y cuando construyo el proyecto todavía intenta agregar paquetes a tfs. Parece que poco puedo hacer para detenerlo.
Matt
¿Puedes publicar el archivo de ignorar que agregaste?
MrHinsh - Martin Hinshelwood
2
Vea docs.nuget.org/docs/reference/package-restore-with-team-build : es un error de NuGet con .tfignore, pero puede corregirse diciéndole a NuGet que se esfuerce por la integración SCM.
usuario2864740
1
Parece que su ejemplo podría estar equivocado, cree que debería ser en packageslugar de \packagesser relativo.
Martin
6

¡Puede configurarlo de forma permanente en AppData\Roamingtodas sus soluciones (antiguas y nuevas)!

En su %AppData%\NuGet\NuGet.Configarchivo, agregue lo siguiente justo antes de la </configuration>etiqueta XML ...

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

... puede especificar cualquier ruta que desee: ¡lo importante es colocarla FUERA de su espacio de trabajo TFS!

Ahora nunca más tendrás que preocuparte por esas cosas. Su carpeta de soluciones ya no contendrá ningún paquete; todas las soluciones usarán de manera predeterminada la ubicación de sus paquetes personalizados.

NOTA: esto funciona por usuario.

Heliaco
fuente
1
Suena bien y posiblemente mucho más simple. ¿Tiene que aplicar esta configuración en todo su equipo, y especialmente el inicio de sesión / configuración de sus servidores de compilación también si adopta este enfoque?
Chris F Carroll
Me lo imagino. No he probado este servidor de compilación WRT, lo siento. También me imagino que diferentes rutas de carpetas a las carpetas lib podrían causar problemas (creo que algunos paquetes NuGet tienen referencias a las rutas lib si recuerdo correctamente).
Heliac
2

Configure su solución para restaurar en la compilación, la carpeta del paquete y el archivo de paquetes se registrarán pero los paquetes no.

Solo TFS
fuente
1
Por favor explique "restaurar en la compilación".
usuario2864740
10
La funcionalidad de clic derecho de Visual Studio "habilitar la restauración del paquete NuGet" está en desuso a partir de NuGet 2.7: TFS 2013 admite de forma nativa la restauración de paquetes NuGet sin el archivo NuGet.targets y las modificaciones a los archivos de proyecto.
Daniel Mann
1

Si está utilizando Git con TFS, debe agregar un archivo ".gitignore". Puede hacer esto en "proyecto de equipo | Configuración | 'agregar ignorar archivo'". Luego abra el archivo y elimine el comentario de la instrucción de ignorar incorporada para los paquetes Nuget.

Si está utilizando TFVC y tiene espacios de trabajo locales configurados, puede usar el archivo ".tfignore" que respeta un formato idéntico al archivo Git. Creo que necesitas "paquetes /".

MrHinsh - Martin Hinshelwood
fuente
nosotros usamos TFSVC y, como ya se mencionó en la publicación inicial, el archivo .tfignore no funciona.
Jaster
Como dije, debes usar el formato correcto de .tfignore. Creo que tienes la barra al revés
MrHinsh - Martin Hinshelwood
@MrHinsh después de hablar con Ed Thompson, el archivo .tfignore no funciona correctamente. Sin embargo, el .gitignore sí.
DaveShaw
@Ed necesita ir a arreglar eso;)
MrHinsh - Martin Hinshelwood
1

Esto no funcionó para mí en Visual Studio en línea y VS2013.

  • Haga clic con el botón derecho en Solución> Habilitar restauración de paquete NuGet. Esto agregará el archivo Nuget.config a la solución

ingrese la descripción de la imagen aquí

  • Agrega el .tfignore. Normalmente hago esto agregando un archivo de texto a la raíz de la solución, dejándolo detectar y luego excluyendo haciendo clic en 'agregar agregado'> haga clic derecho en ignorar.

ingrese la descripción de la imagen aquí

  • Agregue los paquetes a .tfignore y dígale que incluya repositorios.config

ingrese la descripción de la imagen aquí

De los otros comentarios parece que su kilometraje puede variar en este momento. Esto es lo que hago:

  • Verifique todo, incluidos los paquetes.

  • Elimine todos los paquetes en su solución y luego verifique este cambio (esto eliminará los paquetes de TFS)

  • Abra la solución y compile lo que agregará los paquetes al proyecto pero TFS no los recogerá.

David Wilton
fuente
2
Primero, la opción Habilitar restauración de Nuget está desactualizada, y no estará allí en VS 2015, si sigue esa ruta más tarde. Segundo: al marcar paquetes y dlls los agregará al control de origen, los eliminará en la solución y comprobará que NO los eliminará de SC, solo desde la punta de su rama. -
Terje Sandstrøm
1
@ TerjeSandstrøm, pero la pregunta es específica para 2013. Sí, tienes razón, tendrías que usar tf destroy para eliminarlo permanentemente del control de código fuente, pero no encontré otra forma de hacer que TFS se adhiera al archivo .tfignore
David Wilton
1

La solución que funcionó para mí fue crear un .tfignore y la siguiente configuración en Nuget.Config:

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

Mi .tfignore contiene esta línea:

\packages

[Estoy usando Visual Studio 2015 Update 2]

Esto no es ideal, y actualmente está registrado como un problema abierto en github / nuget:

Facilite la omisión de paquetes de TFVC # 493

Redcalx
fuente
0

La respuesta de Terje no funciona todo el tiempo para mí, a veces funcionará por un tiempo, pero luego volverá a tener una carga de "adiciones" para mí nuevamente.

La única forma que he encontrado para resolver esto permanentemente es Encubrir la carpeta de paquetes en mi Espacio de trabajo.

Por ejemplo:

Type      Server                Local
============================================
Active    $/Work/Main           C:\Code\Main
Cloaked   $/Work/Main/Packages
DaveShaw
fuente
Eso fue muy raro. ¿Esto sucede con las últimas versiones de Visual Studio y NuGet?
Terje Sandstrøm
Sí, ejecuto VS 2013.4 y NuGet 2.8 en espacios de trabajo locales de TFS 2012.
DaveShaw
Debe ocultar CADA carpeta de paquetes para docenas de proyectos y contaminaciones. Además, cada miembro del equipo debe repetir el procedimiento para cada espacio de trabajo
Jaster,
Cloak no es una buena respuesta y las otras dos respuestas anteriores funcionan y son por diseño. Debe haber algo más en su entorno.
MrHinsh - Martin Hinshelwood
@MrHinsh: varias personas en el departamento han mirado esto y simplemente está roto. Parece estar bien con Git, pero cuando usa TFVC lo hace todo el tiempo.
DaveShaw
0

Tuve el mismo problema. /packagesdebería funcionar pero no lo hizo para mí. packages*.*funcionó

coding4fun
fuente