Инструменты iOS-разработчика

Создание Xcodeproj с помощью Tuist

Избавьтесь от нечитаемых файлов xcodeproj и поздоровайтесь с читаемыми файлами конфигурации проекта

Вы когда-нибудь создавали запросы на вытягивание (PR)/запросы на слияние (MR) с изменениями в файле xcodeproj вашего проекта приложения для iOS?

Вполне вероятно, что команда из еще двух разработчиков iOS будет одновременно вносить изменения в файлы xcodeproj.

Например, оба могут создавать новые файлы. В таком случае вы можете создать конфликтующие изменения, поскольку вы оба изменяете один и тот же файл. Кроме того, файлы xcodeproj не читаются. Просмотр PR с изменениями в файлах xcodeproj трудно понять и понять.

Есть ли способ избавиться от xcodeproj файлов? К сожалению, нет простого способа избавиться от этих xcodeproj файлов для разработки приложений для iOS.

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

Tuist позволяет вам хранить конфигурацию вашего проекта в Swift в файле с именем Project.swift. Затем Tuist генерирует файлы xcodeproj на основе кода Swift в Project.swift.

Это похоже на Swift Package Manager Package.swift.

В этом посте я покажу вам, как адаптировать пример проекта для использования Tuist. Затем я покажу, как добавить Swift Packages в целевое приложение iOS с помощью Tuist. Далее я покажу вам, как кэшировать модули с помощью Tuist. Наконец, я расскажу, как изменить настройки сборки.

Для этой статьи я использовал Swift 5.6 и Xcode 13.3.

Как преобразовать проект приложения iOS для использования Tuist

В этом разделе мы начнем с установки Tuist.

Затем мы загрузим уже существующее приложение.

Наконец, создайте файл конфигурации проекта Tuist, удалите существующий файл xcodeproj и сгенерируйте файл xcodeproj с помощью Tuist.

Вот шаги, которые мы собираемся предпринять:

  1. Установить Туист
  2. Скачать стартовый пакет
  3. Конвертация проекта для использования Tuist

Давайте начнем!

1. Установите Туист

Есть только способ установить Tuist (на момент написания статьи). Откройте терминал и выполните следующую команду:

curl -Ls https://install.tuist.io | bash

2. Загрузите стартовый пакет

Давайте загрузим уже существующий проект iOS-приложения. Откройте терминал и выполните следующие команды:

cd $HOME
curl https://github.com/anuragajwani/tuist-tut/archive/starter.zip -o starter.zip -L -s
unzip -q starter.zip
cd tuist-tut-starter
open -a Xcode SaladMaker.xcodeproj

Запустите приложение, чтобы увидеть его в действии.

3. Конвертация проекта для использования Tuist

Чтобы мы могли сгенерировать файлы xcodeproj, мы должны объявить структуру проекта, его цели и конфигурацию в файле с именем Project.swift. Сначала давайте посмотрим на цели проекта и его конфигурацию в текущем xcodeproj:

Проект SaladMaker состоит из 2 целей:

  1. SaladMaker iOS-приложение
  2. SayHelloKit каркас

Исходный код SaladMaker находится внутри каталога с именем SaladMaker. Исходный код для SayHelloKit находится внутри каталога с именем SayHelloKit. Обе эти цели поддерживают iOS 14 и выше. SayHelloKit framework используется приложением SaladMaker.

Далее давайте создадим файл Project.swift. В терминале выполните следующую команду:

cat > Project.swift <<-EOF
import ProjectDescription
let project = Project(
    name: "SaladMaker",
    organizationName: "com.anuragajwani",
    targets: [
        Target(
            name: "SaladMaker",
            platform: .iOS,
            product: .app,
            bundleId: "com.anuragajwani.SaladMaker",
            deploymentTarget: .iOS(targetVersion: "14.0", devices: .iphone),
            infoPlist: "SaladMaker/Info.plist",
            sources: ["SaladMaker/**"],
            resources: ["SaladMaker/Assets.xcassets/"],
            dependencies: [.target(name: "SayHelloKit")]
        ),
        Target(
            name: "SayHelloKit",
            platform: .iOS,
            product: .framework,
            bundleId: "com.anuragajwani.SayHelloKit",
            deploymentTarget: .iOS(targetVersion: "14.0", devices: .iphone),
            sources: ["SayHelloKit/**"],
            settings: .settings(base: ["GENERATE_INFOPLIST_FILE": "YES"])
        )
    ]
)
EOF

Выше мы создали проект с именем SaladMaker с двумя целями; приложение SaladMaker для iOS и фреймворк SayHelloKit. Мы указали каждый:

  • имя цели
  • идентификатор пакета
  • платформа, которую он обслуживает
  • тип продукта
  • где лежит его исходный код
  • где лежат его активы (изображения, текстовые файлы и другие файлы, не относящиеся к коду)

Обратите внимание, что мы также объявили параметр сборки для цели платформы. Не беспокойтесь об этом, мы вернемся к этому позже в разделе «Как изменить настройки сборки» этого поста. Кроме того, мы объявили, что приложение SaladMaker зависит от SayHelloKit:

dependencies: [.target(name: "SayHelloKit")]

Затем давайте удалим SaladMaker.xcodeproj и скажем Tuist сгенерировать файлы xcodeproj для проекта. Выполните следующую команду:

rm -rf SaladMaker.xcodeproj && tuist generate

Tuist автоматически откроет для вас Xcode. Запустите приложение, и оно должно работать так же, как и раньше.

Вот и все, теперь мы генерируем нечитаемый xcodeproj более 500 строк из 31 строки кода Swift!

Как добавить пакеты Swift при использовании Tuist

Большинство приложений используют библиотеки с открытым исходным кодом, чтобы помочь или ускорить разработку. Существует несколько способов импорта библиотек с открытым исходным кодом. Одним из самых популярных методов является использование менеджера зависимостей. Одним из самых популярных менеджеров зависимостей, используемых в iOS-разработке, является Swift Package Manager.

В этом разделе я покажу вам, как импортировать популярную библиотеку с открытым исходным кодом, используемую в разработке iOS: Alamofire.

В терминале выполните следующие команды в корне проекта:

mkdir Tuist && cd Tuist
cat > Dependencies.swift <<-EOF
import ProjectDescription
let dependencies = Dependencies(
    swiftPackageManager: [
        .remote(url: "https://github.com/Alamofire/Alamofire", requirement: .upToNextMajor(from: "5.0.0")),
    ],
    platforms: [.iOS]
)
EOF

Чтобы мы могли использовать сторонние внешние зависимости в нашем проекте с помощью Tuist, мы должны объявить эти зависимости в файле с именем Dependencies.swift в каталоге с именем Tuist в корне проекта.

Обратите внимание, что зависимости, объявленные в Dependencies.swift, должны поддерживать Swift Package Manager.

Теперь мы можем указать Tuist получить эти внешние зависимости, выполнив следующую команду в корне проекта:

tuist fetch

Мы еще не сказали Tuist, что хотим использовать Alamofire в приложении SaladMaker. Давайте сделаем это дальше. Откройте Project.swift и измените зависимости SaladMaker на следующие:

dependencies: [
    .target(name: "SayHelloKit"),
    .external(name: "Alamofire")
]

Затем давайте скажем Tuist повторно сгенерировать файлы xcodeproj. Выполните следующую команду в терминале:

tuist generate

Теперь мы готовы использовать Alamofire в приложении SaladMaker:

Как кэшировать модули

При разработке приложений для iOS Xcode компилирует весь исходный код как часть процесса сборки, включая сторонние зависимости. Например, в приложении SaladMaker мы начали использовать Alamofire. Вряд ли нам когда-нибудь понадобится менять код Alamofire. Тем не менее, Xcode будет продолжать создавать Alamofire снова и снова много раз в процессе разработки.

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

Что, если бы мы могли создать его один раз и повторно использовать построенную или скомпилированную форму с этого момента для наших сборок во время разработки? Другими словами: можем ли мы кэшировать модули?

В этом разделе мы рассмотрим:

  1. Как кэшировать внешние сторонние зависимости
  2. Как кэшировать модули проекта

1. Как кэшировать внешние сторонние зависимости

Мы можем кэшировать Alamofire и другие сторонние зависимости (объявленные в Dependencies.swift) и использовать их скомпилированную форму в процессе сборки нашего приложения во время разработки. Для этого выполните следующую команду:

tuist cache warm --dependencies-only

Туист будет строить и кэшировать Аламофайр. Далее давайте скажем Tuist пересгенерировать проект, и он автоматически будет использовать кешированный Alamofire. Выполните следующую команду:

tuist generate

2. Как кэшировать модули проекта

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

tuist cache warm SayHelloKit

Если мы хотим работать только над целью SaladMaker, мы должны сообщить Tuist, что мы хотим разработать только эту цель:

tuist generate SaladMaker

Затем Tuist заменит свои зависимости кэшированными версиями таких зависимостей.

Как изменить настройки сборки

По умолчанию Tuist установит параметры сборки xcodeproj по умолчанию или не укажет их вообще и позволит Xcode установить значения по умолчанию.

Однако в некоторых случаях мы можем захотеть настроить параметры сборки в соответствии с потребностями нашего приложения. Tuist позволяет нам указать любые параметры сборки, которые вы хотите установить для цели. Допустим, мы хотим отключить биткод для нашего приложения SaladMaker. Откройте Project.swift и в конце объявления цели приложения SaladMaker добавьте следующую строку:

    ...
    dependencies: [
        .target(name: "SayHelloKit"),
        .external(name: "Alamofire")
    ],
    settings: .settings(base: ["ENABLE_BITCODE": "NO"])
)

Еще раз давайте скажем Tuist повторно сгенерировать файлы xcodeproj:

tuist generate

Смотрите изменения в действии:

Краткое содержание

В этом посте мы узнали:

  • Как сгенерировать Xcodeprojs с помощью Tuist
  • Как использовать пакеты Swift при использовании Tuist
  • Как изменить настройки сборки при использовании Tuist
  • Как добавить этапы сборки при использовании Tuist
  • Как кэшировать модули с помощью Tuist

С помощью Tuist можно настроить многое. Обязательно ознакомьтесь со спецификациями и документацией.

Последние мысли

Вы можете найти исходный код в этом посте в my Github repo tuist-tut:



Несколько недель назад я рассказывал о том, как генерировать Xcodeproj с помощью Xcodegen. Xcodegen объявляет проекты в форматах YML. Туист объявляет проекты на Swift. Оба могут использовать Swift Packages. Однако Tuist не добавляет Swift Packages в проект обычным способом, которым затем управляет Xcode. Tuist строит графы зависимостей, чтобы затем добавлять дополнительные функции, такие как кэширование модулей.

Если вы хотите генерировать только файлы Xcodeproj, формат зависит от ваших предпочтений (YML или Swift). Лично я предпочитаю Xcodegen project.yml, так как, на мой взгляд, он более читаем, чем Tuist Project.swift. Однако Туист может предложить больше.

Want to Connect?
For more on iOS development follow me on Twitter or Medium.