Получить TFS, чтобы игнорировать мою папку пакетов

332

Я пытаюсь заставить TFS (2013) игнорировать мою packagesпапку. Я страстно не хочу, чтобы источник контролировался, поскольку я использую NuGet, и это здорово!

Я пытался скрыть (кажется, не работает), я пытался добавить .tfignoreфайлы - ничего не игнорируется. Почему команда TFS не добавляет опцию для постоянного игнорирования папки или файла, как это делают многие клиенты Subversion ?!

Matt
источник
Какие версии TFS и Visual Studio вы используете? Вы используете локальные или серверные рабочие пространства?
Джеймс Рид
По-видимому, это ошибка NuGet: docs.nuget.org/docs/reference/package-restore-with-team-build
user2864740
возможный дубликат tfIgnore у меня не работает в Visual Studio 2013
Эдвард Брей
1
Вы должны изменить ответ на этот вопрос
Крис Марисик
3
Если вы используете NuGet, папка пакетов обязательна. Вы можете настроить NuGet на восстановление отсутствующих двоичных файлов при сборке (так, чтобы вы управляли исходной папкой пакетов, но игнорировали двоичные файлы). - Но есть проблемы с этим: возможно, что двоичный файл NuGet будет обновлен (без изменения номера версии), или будет удален и т. Д. - Возможны всевозможные странные странности. Не оставляйте свои сборки на волю случая - проверьте всю папку пакетов. Вы избавите себя от многих головных болей.
BrainSlugs83

Ответы:

497

Вот в чем дело: мы должны сказать и NuGet, и TFS игнорировать пакеты, потому что NuGet пытается делать вещи, связанные с управлением исходным кодом, чего он абсолютно не должен делать (дурной тон, Microsoft!). Таким образом, вы должны сделать две вещи.

Сначала добавьте файл с именем .tfignoreв папку решения (обратите внимание на отсутствие sпосле tf). Его содержание должно быть следующим:

\packages

Это говорит TFS игнорировать папку ваших пакетов. Теперь вы можете подумать, что это также проигнорирует repositories.configфайл. Но это не так. Зачем? Кто знает, пути Microsoft странные и загадочные. На самом деле, я думаю, что это часть NuGet, которую я обрисовал в общих чертах ниже, но если это когда-нибудь будет исправлено в будущем, и вы захотите сохранить repositories.configфайл вместо того, чтобы позволить VS восстановить его, вы должны быть в состоянии использовать это:

\packages
!\packages\repositories.config

Хорошо, теперь, благодаря нашему .tfignoreфайлу, TFS игнорирует ваши пакеты. Все хорошо, верно? НЕПРАВИЛЬНО , потому что NuGet работает с вашим контролем версий и добавляет пакеты в ожидающие изменения. Так что теперь давайте скажем NuGet, чтобы он уже вырезал.

Создайте папку с именем .nugetв корне папки вашего решения. 1 Теперь создайте файл с именем NuGet.configи поместите его в эту новую папку 2 . Его содержимое должно выглядеть так:

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

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

РЕДАКТИРОВАТЬ: Если у вас возникли проблемы, вы можете удалить папку пакетов, проверить это изменение, а затем выполните действия, описанные выше.

ТАКЖЕ РЕДАКТИРОВАТЬ: Похоже, что это не произойдет с более новыми версиями Nuget. Так что, возможно, если вы переключитесь на VS / TFS 2017, эта проблема исчезнет, ​​не перепрыгивая через описанные выше обручи.

1 . Добавьте папку с помощью Source Control Explorer; щелкните правой кнопкой мыши решение-> Добавить папку ->. nuget
2 . Когда я понял это с помощью VS 2013, я обнаружил, что NuGet.config должен быть в папке .nuget. Даже если у вас уже есть файл NuGet.config в корне папки вашего решения (потому что, скажем, у вашей компании есть внутренний фид Nuget). Тем не менее, некоторые в комментариях указали, что он отлично работает в корне решения в VS 2015. Лично я перешел на использование TFS в режиме git, поэтому я не могу проверить. Кроме того, если у вас есть пользовательский канал, убедитесь, что у вас есть и пользовательский канал, и nuget.org в качестве ключей в файле Nuget.config, или иногда TFS случайным образом решит, что не может восстановить пакеты.

Pharylon
источник
1
Я считаю, что это требует TFS 2012 по крайней мере. stackoverflow.com/questions/14365929/…
ClearCloud8
2
@zespri Какой файл ожидает удаления? Пакет NuGet? Это не должно быть в ожидании удаления ... это должно быть удалено! После того, как вы сделаете то, что я предложил выше, перейдите в Team Explorer и удалите все пакеты Nuget, которые уже могут находиться в системе контроля версий. Или просто удалите папку с пакетами. Я катался с этой настройкой в ​​течение нескольких месяцев и никогда не сталкивался с такой ошибкой.
Фарилон
5
К вашему сведению в VS2015, nuget.config не обязательно должен быть внутри /.nuget/. Отлично работает в корне решения.
jnm2
141
Для всех, кто интересуется, как создать папку и файл, начинающийся с точки, завершите имя другим периодом. Так что это будет .tfignore. и .nuget.
Дерек Зимба
16
@DerekZiemba Аккуратный трюк! Я делал это через командную строку все эти годы. Я думаю, что стоит упомянуть, что когда вы делаете это, трейлинг "." будет удален, я изначально думал, что вы предлагаете просто жить с дополнительным "." в конце.
53

Альтернативное решение вышесказанного заключается в следующем.

  • Добавить папку пакетов в TFS (без каких-либо файлов или подпапок)
  • Щелкните правой кнопкой мыши на папке «Пакеты».
  • Расширенный щелчок левой кнопкой мыши
  • Нажмите Плащ

Стоит отметить, что это решение необходимо будет применять для каждого рабочего пространства TFS. Это сработало гораздо надежнее для меня, чем использование .tfignoreфайла.

Вы можете прочитать больше об этом подходе в статье блога Запретить TFS добавлять установленные пакеты NuGet в систему контроля версий .

Райан Гейтс
источник
23

для людей, сообщающих, что опция .tfignore не работает с параметром nuget.config, это может быть интересно - эти шаги, наконец, сработали для меня:

  1. Удалить все в моей папке пакетов
  2. Убедитесь, что TFS не имеет никаких изменений в этой папке в ожидании
  3. Закрыть VS
  4. Снова откройте VS и перезагрузите решение - используйте восстановление Nuget для повторного заполнения пакетов. Обратите внимание, что для управления исходным кодом TFS не ожидается никаких изменений
Адам Стюарт
источник
3
Это сработало для меня после применения решения Pharylon, которое я сделал после восстановления пакетов.
user849924
1
Действительно полезно, мы должны сделать это в первый раз (первая фиксация файла .tfignore в TFS), но не для каждого. если я прав.
RajeshKdev
Я думаю, что этот подход будет работать только на машине, которая делает плащ. Я прав? так что это не решает проблему корней для всех членов команды.
Panox
Вариант этого сработал для меня - я убедился, что ничего из пакетов не было зафиксировано, затем удалил каталог пакетов с диска. На этом этапе он все еще отображался как ожидающие изменения в проводнике команды VS, поэтому я решил отменить изменения, ожидающие в каталоге пакетов. Это очистило его (без необходимости закрывать / открывать), и они не возвращаются =)
frax
8

Добавьте файл nuget.config в папку .nuget в своем решении. Добавьте следующее в файл nuget.config:

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

DisableSourceControlIntegration - вот что делает трюк для контроля версий TFS.

Терье Сандстрём
источник
Не имеет никакого эффекта - тоже не глобальное решение вообще.
Jaster
@ Так много Гоблинов: Вы пробовали это на совершенно новом проекте / SLN? (Просто для проверки) Мне любопытно, что в вашей настройке делает это неработающим, так как оно работает каждый раз, когда я делаю это сам, и это рекомендуемый способ сделать это с TFS / nuget. Кроме того, на какой версии VS / TFS вы видите это?
Терье Сандстрём,
Visual studio 2013. Новое решение, да. Я работал над этой проблемой, добавляя .tfignore, игнорируя явно каждый пакет.
Так много гоблинов
2
Хорошо, это то, что делает «Включить восстановление пакета NuGet». Просто обязательно ЗАКРЫТЬ и заново открыть свое решение! Файл NuGet.config читается только после открытия вашего решения.
Heliac
Это не сработало для меня на визуальной студии онлайн и VS2013. Я использовал Решение правой кнопкой мыши> Включить восстановление пакета NuGet. Это добавит файл Nuget.config в корень решения. Добавьте .tfignore. Обычно я делаю это, добавляя текстовый файл в корень решения, позволяя ему обнаружить это, а затем исключая, щелкая «обнаруженное добавление»> игнорировать правой кнопкой мыши. Затем проверьте все, в том числе и любые пакеты. Затем удалите все пакеты в вашем решении и отметьте это изменение (это приведет к удалению пакетов из TFS). Откройте решение и выполните сборку, которая добавит пакеты, но TFS не подберет их.
Дэвид Уилтон
7

Вы должны использовать локальные рабочие пространства для .tfignoreработы. .tfignoreФайл должен находиться в папке , которая содержит файлы или папки , которые вы хотите игнорировать.

Итак, если ваша структура решения выглядит следующим образом:

\Project
   \Packages
   \OtherStuff
   foo.cs

Вы бы поместили свой файл .tfignore в \ Project:

\Project
   \Packages
   \OtherStuff
   foo.cs
   .tfignore

Содержимое .tfignore в вашем случае будет:

\packages

Вот некоторая документация для вас: http://msdn.microsoft.com/library/vstudio/ms245454(v=vs.110).aspx#tfignore

Даниэль Манн
источник
2
Я добавил файлы .tfignore, и когда я собираю проект, он все еще пытается добавить пакеты в tfs. Кажется, я мало что могу сделать, чтобы остановить это.
Мэтт
Можете ли вы опубликовать добавленный вами файл игнорирования?
MrHinsh - Martin Hinshelwood
2
См. Docs.nuget.org/docs/reference/package-restore-with-team-build - это ошибка NuGet с .tfignore, но ее можно исправить, сказав NuGet идти вперёд для интеграции с SCM.
user2864740
1
Похоже, вы пример, возможно, не так, Он думает, что это должно быть, packagesа не \packagesкак относительный.
Мартин
6

Вы можете навсегда установить это единовременное AppData\Roamingрешение для всех решений (старых и новых)!

В своем %AppData%\NuGet\NuGet.Configфайле добавьте следующее прямо перед </configuration>тегом XML ...

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

... вы можете указать любой путь, который вам нужен - главное, чтобы он был вне вашего рабочего пространства TFS!

Теперь вам больше не придется беспокоиться об этом. В папке вашего решения больше не будет пакетов; все решения по умолчанию будут использовать вместо вас расположение ваших пользовательских пакетов.

ПРИМЕЧАНИЕ. - Это работает для каждого пользователя.

совпадающий с восходом солнца
источник
1
Звучит хорошо и, возможно, намного проще. Вы должны применять эту настройку в вашей команде, и особенно в том, что касается входа / настройки серверов сборки, если вы используете этот подход?
Крис Ф. Кэрролл
Я бы так себе представил. Я не тестировал серверы сборки WRT, извините. Я также предположил бы, что различные пути к папкам lib могут вызвать проблемы (я думаю, что некоторые пакеты NuGet имеют жесткие ссылки на пути lib, если я правильно помню).
Heliac
2

Установите решение для восстановления при сборке, папка пакета и файл пакетов будут проверены, но пакеты не будут.

Просто TFS
источник
1
Пожалуйста, объясните "восстановить на билде".
user2864740
10
В Visual Studio щелчок правой кнопкой мыши «включить восстановление пакета NuGet» устарел, начиная с NuGet 2.7. TFS 2013 изначально поддерживает восстановление пакетов NuGet без файла NuGet.targets и внесение изменений в файлы proj.
Даниэль Манн
1

Если вы используете Git с TFS, вам нужно добавить файл «.gitignore». Вы можете сделать это в «командном проекте | Настройки |« Добавить файл игнорирования »». Затем откройте файл и раскомментируйте встроенный оператор игнорирования для пакетов Nuget.

Если вы используете TFVC и у вас настроены локальные рабочие пространства, вы можете использовать файл ".tfignore", который соответствует формату, аналогичному файлу Git. Я думаю, что вам нужны "пакеты /".

Мистер Хинш - Мартин Хиншелвуд
источник
мы используем TFSVC и, как уже упоминалось в первоначальном посте, файл .tfignore не работает.
Джастер
Как я уже говорил, вам нужно использовать правильный формат .tfignore. Я считаю , что вы косой черты навыворот
MrHinsh - Мартин Hinshelwood
@MrHinsh после разговора с Эдом Томпсоном файл .tfignore работает неправильно. .Gitignore делает, хотя.
DaveShaw
@Ed нужно пойти исправить это;)
Мистер Хинш - Мартин Хиншелвуд
1

Это не сработало для меня на визуальной студии онлайн и VS2013.

  • Щелкните правой кнопкой мыши Решение> Включить восстановление пакета NuGet. Это добавит файл Nuget.config в решение

введите описание изображения здесь

  • Добавьте .tfignore. Обычно я делаю это, добавляя текстовый файл в корень решения, позволяя ему это обнаружить, а затем исключая, щелкая «обнаруженное добавление»> игнорировать правой кнопкой мыши.

введите описание изображения здесь

  • Добавьте пакеты в .tfignore и скажите, чтобы они включали repositories.config

введите описание изображения здесь

Из других комментариев кажется, что ваш milage может отличаться на этом этапе. Вот что я делаю:

  • Проверьте все, в том числе любые пакеты.

  • Удалите все пакеты в вашем решении и затем отметьте это изменение (это удалит пакеты из TFS)

  • Откройте решение и выполните сборку, которая добавит пакеты в проект, но TFS не подберет их.

Дэвид Уилтон
источник
2
Во-первых, активировать восстановление Nuget не рекомендуется, а не в VS 2015, если вы пойдете по этому пути позже. Второе: проверка пакетов и библиотек добавит их в систему контроля версий, удалив их в решении и отметив, что они НЕ удалят их из SC, а только из кончика вашей ветви. -
Терье Сандстрём
1
@ TerjeSandstrøm замечание принято, но вопрос относится к 2013 году. Да, вы правы, вам придется использовать tf destroy, чтобы навсегда удалить его из системы контроля версий, но я не нашел другого способа заставить TFS придерживаться файла .tfignore
Дэвид Уилтон
1

Решение, которое мне помогло, состояло в том, чтобы создать .tfignore и следующий параметр в Nuget.Config:

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

Мой .tfignore содержит эту строку:

\packages

[Я использую Visual Studio 2015 Update 2]

Это не идеально, и в настоящее время зарегистрирован как открытая проблема на github / nuget:

Упростите пропуск пакетов из TFVC # 493

redcalx
источник
0

Ответ Терье не работает для меня все время, иногда он будет работать какое-то время, но затем он снова и снова будет ожидать для меня «добавлений».

Единственный способ решить эту проблему навсегда - это скрыть папку пакетов в моей рабочей области.

Например:

Type      Server                Local
============================================
Active    $/Work/Main           C:\Code\Main
Cloaked   $/Work/Main/Packages
DaveShaw
источник
Это было очень странно. Это происходит с последними версиями Visual Studio и NuGet?
Терье Сандстрём,
Да, я запускаю VS 2013.4 и NuGet 2.8 в локальных рабочих пространствах TFS 2012.
DaveShaw
Вы должны скрыть КАЖДУЮ папку пакета для десятков проектов и решений. Также каждый член команды должен повторить процедуру для каждого рабочего пространства
Jaster
Плащ не очень хорошие ответы, и два других ответа выше работают и являются дизайн. Там должно быть что-то еще происходит в вашей среде.
Мистер Хинш - Мартин Хиншелвуд
@MrHinsh - различные люди в отделе смотрели на это, и оно просто сломано. С Git все в порядке, но при использовании TFVC это происходит постоянно.
DaveShaw
0

Я была такая же проблема. /packagesдолжен работать, но не для меня. packages*.*сделал работу.

Coding4Fun
источник