Отримати TFS, щоб ігнорувати мою папку пакунків


332

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

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


Які версії TFS та Visual studio ви використовуєте? Використовуєте локальні чи серверні робочі простори?
Джеймс Рід



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 . Додайте папку за допомогою Explorer Control Explorer; клацніть правою кнопкою миші рішення-> Додати папку ->. nuget
2 . Коли я зрозумів це за допомогою VS 2013, я виявив, що NuGet.config повинен був перейти в папку .nuget. Навіть якщо у вас вже є файл NuGet.config у корені папки з рішеннями (оскільки, скажімо, у вашої компанії є внутрішній нудовий канал). Однак деякі з коментарів вказали, що він працює добре в корені рішення у VS 2015. Особисто я перейшов на використання TFS в режимі git, тому не можу перевірити. Крім того, якщо у вас є власний канал, переконайтеся, що у вас є як власний канал, так і nuget.org як ключі у файлі Nuget.config, інакше TFS випадково вирішить, що він не може відновити пакунки.


1
Я вважаю, що для цього необхідний принаймні TFS 2012. stackoverflow.com/questions/14365929 / ...
ClearCloud8

2
@zespri Який файл очікує на видалення? Пакет NuGet? Це не повинно очікувати на видалення ... його слід видалити! Після того, як ви зробите те, що я запропонував вище, перейдіть до Team Explorer і видаліть усі пакунки Nuget, які вже можуть знаходитися в контролі джерела. Або просто видаліть папку пакунків. Я працюю з цією програмою протягом місяців і жодного разу не відчував цієї помилки.
Фарилон

5
Fyi у VS2015, nuget.config не повинен бути всередині /.nuget/. Він чудово працює в корені розчину.
jnm2

141
Для всіх, хто цікавиться, як створити папку та файл, який починається з періоду, закінчувати ім'я ще однією періодом. Так це було б .tfignore. і .nuget.
Дерек Земба

16
@DerekZiemba Акуратний трюк! Я робив це за допомогою командного рядка всі ці роки. Я думаю, що варто згадати, що коли ти це робиш, то "." буде видалено, я спочатку думав, що ваша пропозиція - просто жити із зайвою ". в кінці.

53

Альтернативним рішенням вищезазначеного є наступне.

  • Додайте папку пакунків до TFS (без файлів і підпапок)
  • Клацніть правою кнопкою миші папку «Пакети»
  • Клацніть лівою кнопкою миші Advanced
  • Клацніть Плащ

Варто зазначити, що це рішення потрібно застосовувати для робочої області TFS. Це працювало набагато надійніше для мене, ніж використання .tfignoreфайлу.

Докладніше про цей підхід можна прочитати в статті блогу Заборона TFS додавати встановлені пакети NuGet до керування джерелами .


23

для людей, які повідомляють, що параметр .tfignore не працює з налаштуванням nuget.config, це може зацікавити - ці кроки нарешті спрацювали для мене:

  1. Видалити все в папці моїх пакунків
  2. Переконайтесь, що TFS не має змін навколо цієї папки, що очікує на розгляд
  3. Закрити VS
  4. Повторно відкрийте VS та перезавантажте рішення - використовуючи відновлення Nuget для повторного заповнення пакетів. Примітка: ніяких змін не очікується для контролю джерела TFS

3
Це працювало для мене після застосування розчину Pharylon, що я робив після відновлення пакетів.
користувач849924

1
Дійсно корисно, ми повинні зробити це за початковий час (Перше введення файлу .tfignore в TFS), але не для кожного. якщо я маю рацію.
RajeshKdev

Я думаю, що цей підхід буде працювати лише на машині, яка робить плащ. Я маю рацію? тому це не вирішує корінну проблему для всіх членів команди.
панокс

Варіант цього для мене спрацював - я переконався, що нічого з Пакетів уже не було зроблено, а потім видалив каталог пакунків з диска. На даний момент він все ще відображався як очікувані зміни в команді провідника VS, тому я вирішив скасувати зміни, що очікували в каталозі пакунків. Це очистило його (без мене не потрібно закривати / знову відкривати), і вони не повертаються =)
frax

8

Додайте файл nuget.config у папку .nuget у своєму рішенні. Додайте до файлу nuget.config:

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

Функція enableSourceControlIntegration - це те, що робить фокус для TFS Control Control.


Не має ефекту - теж зовсім не глобальне рішення.
Жастер

@So Many Goblins: Ви спробували це на абсолютно новому проекті / sln? (Тільки для перевірки) Мені цікаво, що у ваших налаштуваннях це не працює, як це працює кожен раз, коли я це роблю сам, і це рекомендований спосіб зробити це за допомогою TFS / nuget. Крім того, на якій версії VS / TFS ви бачите це?
Terje Sandstrøm

Візуальна студія 2013. Нове рішення, так. Я вирішив цю проблему, додавши .tfignore явно ігноруючи кожен пакет.
Так багато гоблінів,

2
Гаразд, це ефективно те, що робить "Увімкнути відновлення пакету NuGet". Просто не забудьте ЗАКРИТИ і знову відкрити своє рішення! Файл NuGet.config читається лише після відкриття рішення.
Геліак

Це не спрацювало для мене на візуальній студії в Інтернеті та VS2013. Я використовував Рішення правою кнопкою миші> Увімкнути відновлення пакета NuGet. Це додасть файл Nuget.config до кореня рішення Додати .tfignore. Зазвичай я це роблю, додаючи текстовий файл до кореня рішення, даючи йому це виявити, а потім виключаю, натискаючи «виявлено додавання»> ігнорувати правою кнопкою миші. Потім перевірте все, включаючи будь-які пакунки. Потім видаліть усі пакунки у своєму рішенні та перевірте цю зміну (це видалить пакети з TFS) Відкрийте рішення та складіть, який додасть пакунки, але TFS не забратиме їх.
Девід Уілтон

7

Для роботи вам потрібно використовувати локальні робочі простори .tfignore. The.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 - Мартін Гіншелвуд

2
Дивіться docs.nuget.org/docs/reference/package-restore-with-team-build - це помилка NuGet з .tfignore, але її можна виправити, повідомивши NuGet піти шукати себе для інтеграції SCM.
користувач2864740

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, якщо я правильно пам'ятаю).
Геліак

2

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


1
Поясніть, будь ласка, "відновити під час створення".
користувач2864740

10
Клацніть правою кнопкою миші Visual Studio «включити відновлення пакета NuGet» призупинено, оскільки в NuGet 2.7 - TFS 2013 спочатку підтримує відновлення пакетів NuGet без файлу NuGet.targets та модифікацій файлів proj.
Даніель Манн

1

Якщо ви використовуєте Git з TFS, вам потрібно додати файл ".gitignore". Це можна зробити в "командному проекті | Налаштування |" додати файл ігнорування "". Потім відкрийте файл і скаментуйте вбудований вислів ігнорування Nuget Packages.

Якщо ви використовуєте TFVC і у вас налаштовані локальні робочі простори, ви можете використовувати файл ".tfignore", який має ідентичний формат файлу Git. Я думаю, вам потрібні "пакети /".


ми, TFSVC, і як вже було сказано в початковому пості - .tfignore файл не працює.
Жастер

Як я вже заявив, ви повинні використовувати правильний формат .tfignore. Я вважаю, що ви маєте косу
рису

@MrHinsh після розмови з Едом Томпсоном .tfignore файл працює неправильно. Хоча .gitignore робить.
DaveShaw

@Ed потрібно виправити це;)
MrHinsh - Мартін Хіншелвуд

1

Це не спрацювало для мене на візуальній студії в Інтернеті та VS2013.

  • Клацніть правою кнопкою миші Рішення> Увімкнути відновлення пакета NuGet. Це додасть файл Nuget.config до рішення

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

  • Додайте .tfignore. Зазвичай я це роблю, додаючи текстовий файл до кореня рішення, даючи йому це виявити, а потім виключаю, натискаючи «виявлено додавання»> ігнорувати правою кнопкою миші.

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

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

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

З інших коментарів, здається, ваш пробіг може змінюватися в цей момент. Це те, що я роблю:

  • Перевірте все, включаючи будь-які пакунки.

  • Видаліть усі пакунки у своєму рішенні та перевірте цю зміну (це видалить пакети з TFS)

  • Відкрийте рішення та побудуйте, що додасть пакети до проекту, але TFS не підбере їх.


2
По-перше, увімкнути відновлення Nuget застаріло, а не там у VS 2015, якщо піти цим маршрутом пізніше. По-друге: Перевірка пакетів та dll-ів додасть їх до джерела управління, видаливши їх у рішення та перевіривши, чи НЕ буде видаляти їх із SC, просто з кінця вашої гілки. -
Terje Sandstrøm

1
@ TerjeSandstrøm пункт прийнятий, але питання є специфічним для 2013 року. Так, ви праві, вам доведеться використовувати знищення tf, щоб назавжди видалити його з керування джерелом, але я не знайшов іншого способу змусити 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


0

Відповідь Терє не працює весь час для мене, іноді він буде працювати на деякий час, але тоді це буде ПЕНД вантаж «додає» для мене знову і знову.

Єдиний спосіб, який я знайшов для вирішення цього питання назавжди - це закривати папку пакунків у своїй робочій області.

Наприклад:

Type      Server                Local
============================================
Active    $/Work/Main           C:\Code\Main
Cloaked   $/Work/Main/Packages

Це було дуже дивно. Чи трапляється це з останніми версіями Visual Studio та NuGet?
Terje Sandstrøm

Так, я запускаю VS 2013.4 та NuGet 2.8 на локальних робочих просторах TFS 2012.
DaveShaw

Ви повинні закривати КОЖНУ папку пакетів для десятків проектів та пілотацій. Також кожен член Команди повинен повторити процедуру для кожного робочого простору
Jaster

Плащ не є гарною відповіддю, а дві інші відповіді, наведені вище, працюють і є дизайном. У вашому оточенні повинно бути щось інше.
MrHinsh - Мартін Гіншелвуд

@MrHinsh - різні люди у відділі дивилися на це, і це просто зламано. З Git це здається нормальним, але при використанні TFVC він робить це постійно.
DaveShaw

0

У мене було те саме питання. /packagesповинен працювати, але не для мене. packages*.*зробили роботу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.