Распутывая таинственную папку

Когда когда-либо хорошо игнорировать то, о чем вы ничего не знаете? Возможно, существуют конкретные сценарии, в которых такое действие было бы приемлемым, например, использование автомобиля без понимания двигателя. Тем не менее, когда дело доходит до тех аспектов вашей работы, которые непосредственно влияют на вашу повседневную деятельность, лучшим ответом, вероятно, будет «никогда».

Когда бы я ни запускал новый Android или другой проект на основе IntelliJ, первое, что я делал, это бросал всю папку .idea в свой .gitignore файл, а затем продолжал настраивать свою IDE и проект в соответствии с моими спецификациями. Я никогда больше не думал о том, что игнорировал, потому что понятия не имел, что находится внутри этой папки.

Я мало знал, сколько времени я мог бы сэкономить и какое качество я мог бы привнести в свой проект, если бы я немного лучше разбирался в этой папке и мог бы поделиться ею со своими товарищами по команде. Я довольно много узнал об этой загадочной папке из моих исследований и реального совместного опыта. К концу этой статьи вы поймете, какими частями вы можете поделиться, а что оставить при себе.

Анатомия папки

Трудно определить точную структуру папки .idea, поскольку она часто является свалкой для вашей IDE, плагинов и проекта для хранения информации, не связанной с кодом. Его содержимое может сильно различаться в зависимости от типа проекта и версии IDE. Однако в нем есть базовый набор файлов и папок, которые довольно стандартны. Об этом и пойдет речь в данной статье.

Вот скриншот моей папки .idea из моего хорошо зарекомендовавшего себя проекта:

В оставшейся части этой статьи мы исследуем эти файлы и папки, а также выясним, должны ли они попадать в ваш репозиторий. Даже если вы не согласны с моей рекомендацией на 100%, вы будете обладать необходимыми знаниями, чтобы судить самостоятельно.



Файлы для исключения

С точки зрения репозитория Git я рекомендую игнорировать набор файлов и папок. Имейте в виду, что этот список основан на проекте Android Studio. Ваш опыт может отличаться, если вы используете другую IDE JetBrains или создаете проект, не связанный с JVM.

🗂 тайники

Имя - мертвая распродажа. Содержимое этой папки имеет отношение только к вашей настройке. Согласно этой статье, build_file_checksums.ser внутри этой папки используется для отслеживания того, когда какой-либо из ваших .gradle файлов изменяется и требует синхронизации IDE.

Вы не можете предоставить общий доступ к этой папке и ее содержимому ни по какой причине.

🗂 библиотеки

Эта папка содержит набор XML-файлов, которые указывают на то, где Gradle хранит .jar, .aar и соответствующие ресурсы для каждой зависимой библиотеки для вашего проекта. Эти файлы относятся к вашему $USER_HOME каталогу и часто содержат хеши в путях папок к каждому файлу.

Поскольку эти файлы быстро перестраиваются, зависят от вашего компьютера, очень подвержены изменениям и могут быть автоматически выведены из вашего build.gradle файла, то нет причин для синхронизации его с Git.

🗂 модули

Как и папка libraries, содержимое modules также основано на вашем build.gradle файле. Вы можете думать о файлах внутри как о XML-представлении ваших .gradle файлов. Он содержит информацию о вашем текущем варианте сборки, версии Gradle, структуре каталогов проекта и зависимых библиотеках.

Опять же, поскольку эти файлы можно быстро создать на основе существующей информации, игнорирование их - лучший выбор.

💾 assetWizardSettings.xml

Согласно этой статье, этот файл содержит информацию о последнем векторном активе, который вы импортировали в свой проект Android Studio. Очень интересно. Ваша команда очень хочет увидеть это.

Поскольку этот файл относится к путям за пределами вашего проекта, которые относятся к вашей машине, игнорируйте его.

💾 deploymentTargetDropDown.xml

Android Studio использует этот файл, чтобы запомнить, какое виртуальное устройство Android (AVD) вы ранее выбрали во время последней сборки.

Эти имена и пути AVD относятся к вашей настройке и не переносятся.

💾 jarRepositories.xml

Каждый раз, когда вы добавляете новый репозиторий в свои скрипты Gradle, например Maven Central, JitPack или Google Maven, IntelliJ отслеживает здесь эти репозитории артефактов.

Этот список обновляется для вас при каждой синхронизации Gradle, поэтому нет необходимости обновлять его отдельно.

💾 misc.xml

А, мы столкнулись с файлом свалки IntelliJ. Отправка этого в Git была бы катастрофой, ожидающей своего часа. Возможно, наиболее разрушительной частью будут все уровни масштабирования для конкретных файлов, которые вы использовали в своем проекте.

Никто из членов вашей команды не заботится об этой информации, в любом случае она касается вас.

💾 modules.xml

Этот файл фактически содержит список всех подходящих файлов внутри каталога modules. Итак, поскольку этот каталог исключен, этот файл также должен быть.

💾 navEditor.xml

Если вы используете Android Navigation Component, этот файл будет присутствовать для сохранения внешнего вида файла навигационного графа, такого как размещение узлов X и Y, типы узлов и действия.

Поскольку все, кроме настраиваемого размещения узла XY, создается из XML-файла вашего графа, нет необходимости его синхронизировать.

💾 workspace.xml

Возможно, этот файл - пример того, что нужно не фиксировать в вашем репозитории. Если вы это сделаете, будьте готовы к Третьей мировой войне, которая последует вскоре после этого. Он содержит все, что имеет отношение к установке и времени выполнения вашей IDE, например расположение панелей, открытых вкладок, карты покрытия модульных тестов и информацию о вашем репозитории Git.

Серьезно, не включайте это.



Файлы для включения

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

🗂 codeStyles

Включение этой папки в ваш репозиторий Git имеет огромный потенциал для поддержания чистых и единообразных стандартов кодирования вашего проекта. Если вы используете пользовательские стили кода или настраиваете свою IDE каким-либо образом для другого форматирования кода, эти правила хранятся здесь. В этих XML-файлах сохраняются такие детальные настройки, как использование .* импорта в Java.

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

🗂 словари

Каждый раз, когда вы обучаете средство проверки орфографии понимать новое слово, эти значения сохраняются в XML-файле в этой папке. Эти файлы основаны на вашем имени пользователя. Итак, для моего личного словаря это будет oliverspryn.xml.

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

🗂 fileTemplates

Если вы используете собственные шаблоны файлов, эти скрипты хранятся здесь. Например, MyUPMC Android имеет шаблонный шаблон для модульных тестов, поскольку начало каждого из наших тестов одинаково.

Включение этой папки гарантирует, что каждый будет иметь доступ к вашим файлам шаблонов.

🗂 инспекцияПрофили

Параметры в этой папке определяют, как среда IDE будет обнаруживать предупреждения, потенциальные ошибки и информационные предупреждения и сообщать о них. Если в вашем проекте есть настраиваемые правила предупреждений, они хранятся здесь. Например, наш проект повышает уровень предупреждения о точках с запятой в Котлине до ошибок.

Рекомендую включить эту папку для единообразного применения правил.

🗂 runConfigurations и 💾 runConfigurations.xml

В зависимости от того, какую версию IntelliJ вы используете, пользовательские конфигурации запуска могут храниться в виде нескольких файлов в папке или полностью в одном файле. Эта конфигурация часто бесполезна для Android, поскольку IDE автоматически определяет тип вашей сборки из build.gradle файлов. Однако, если у вас есть настраиваемые типы сборки или вы создаете другой тип проекта, который требует от вас определения того, как его построить, оставьте их при себе.

Сохранение этих файлов значительно сократит драгоценное время установки.

💾 compiler.xml

Здесь хранятся все модули, обнаруженные в вашем проекте, вместе с JDK, необходимым для его сборки. Этот файл полезен для проектов Gradle, особенно если на вашем компьютере установлено несколько версий JDK. Например, нам нужно использовать JDK 11 как минимум для сборки нашего проекта, даже если у большинства из нас установлен JDK 8.

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

💾 gradle.xml

Этот файл очень похож по своему назначению на compiler.xml. Я обычно сохраняю их обоих по одним и тем же причинам.

💾 vcs.xml

Этот файл сообщает IDE, какую систему контроля версий вы используете. Скорее всего, если вы используете Git, эту информацию можно будет определить автоматически. Сохранение этого файла полностью зависит от вас.



Идеи в действии

Вот как это выглядит после преобразования приведенного выше списка в файл .gitignore:

Обратите внимание, как этот сценарий начинается с подхода выжженной земли. Фактически исключено все, включая .iml (хранилище для настроек уровня модуля) и .xml файлы. Затем отдельные файлы и папки медленно добавляются обратно в белый список. Единственное отклонение от стандартной практики - это папка fileTemplates, которая позволяет включать все типы файлов.

IntelliJ использует Apache Velocity и FreeMaker в качестве языков шаблонов. Они могут иметь множество расширений файлов, поэтому я решил включить все файлы в эту папку, чтобы не пропустить ни одного.



Вывод

Понимание того, как IDE хранит свою конфигурацию, было невероятно полезным для меня и моей команды в различных проектах. Мне удалось сократить объем документации, необходимой для новых сотрудников, добиться большей согласованности в стандартах кодирования и обеспечить соблюдение тщательно отобранного набора пользовательских правил в нашем проекте.

Я хочу поблагодарить Gahfy за его статью, которая помогла мне понять значение некоторых из этих файлов, а также команды GitHub и JetBrains за их образец файла .gitignore. Я использовал эти источники в качестве трамплина для своих проектов и этой статьи.

Надеюсь, теперь у вас больше уверенности, что вы сможете с легкостью справляться с папками .idea. Они часто играют недооцененную и непонятую роль в жизни тысяч разработчиков. Теперь, когда у вас есть это фундаментальное понимание, вы можете использовать его для процветания.

Понравилось то, что вы читаете?

На Medium есть тысячи других подобных статей. Я являюсь платным участником этого сайта и полностью считаю, что это вложение оправдано. Нажмите здесь, чтобы присоединиться, и вы поддержите мою работу частью своего членства.

Эта статья изначально была опубликована на https://oliverspryn.com/. Присоединяйтесь к моему списку рассылки.