Evitando conflitos no Xcode


はじめに



O objetivo desse texto é mostrar como resolvi alguns problemas no meu time utilizando o Tuist para gerar projetos e workspaces do Xcode e que com isso nós evitamos conflitos na hora do merge, resolvemos problem as para gerenciardependências e também podemos padronizar configurações dos projetos e abrir individualmente o projeto que vai ser alterado (modo foco).

インストール



インストールは簡単で、端末の実行コマンドはありません:curl -Ls https://install.tuist.io | bash

Criando um projeto novo



Se for um novo projeto a utilização do Tuist é super simples.
Basta criar uma Pasta e executar o tuist init
mkdir MyApp
cd MyApp
tuist init --platform ios


O コマンドは、arquivos base, Info.plist , AppDelegate.swift , arquivos de teste o Project.swift que contém as configurações do projeto.

Migrando um projeto existente



A migração no meu caso foi quietra porque o projeto é simples e tenho um Workspace com vários projetos quedependem do Core e uma unicadependência externcia em um Target de teste.

コアに移行し、プロジェクトの依存関係を定義し、ワークスペースの構成に依存するように解決します.
Na pasta de cada projeto criei o arquivo Project.swift , no diretório raíz o Workspace.swift e a pasta Tuist com o arquivo Dependencies.swift

Configurações do projeto



O Project.swift contém a configuração do projeto.定義された名前、組織、ターゲット、スキーマ、すべての要素が含まれています.

フレームワークをインポートするには ProjectDescription を参照してください Project を参照してください.

Um project precisa obrigatoriamente dos parametros: project e name que é um array do typeo Target.

特定のターゲット、プラットフォーム、製品の種類、コードのバンドルはありません.

let target = Target(name: "App",
                    platform: .iOS,
                    product: .app,
                    bundleId: "com.rafa.example",
                    infoPlist: "Info.plist",
                    sources: "Sources/**",
                    dependencies: [])



let project = Project(
    name: "MyProject",
    targets: [target]
)


外部依存



A integração com dependências externas ainda está em alpha, como é avisado na documentação

No momento que estou escrevendo esse texto a integração com Cocoapods ainda não é suportada.



Cada projeto pode ter suasdependências configuradas individualmente, basta criar a Pasta targets com o arquivo Tuist dentro dela.
No meu caso, fiz isso na Pasta raiz do projeto porque tenho uma únicadependência externa.

import ProjectDescription

let dependencies = Dependencies(
    carthage: [
        .github(path: "Alamofire/Alamofire", requirement: .exact("5.0.4")),
    ],
    swiftPackageManager: [
        .remote(url: "https://github.com/Alamofire/Alamofire", requirement: .upToNextMajor(from: "5.0.0")),
    ],
    platforms: [.iOS]
)


Feito isso baixe asdependências rodandoDependencies.swift.ウマ パスタ チャマダ

De volta ao tuist dependencies fetch é necessário registrar no 依存するバイシャダをターゲットにします.

let target = Target(name: "App",
                    platform: .iOS,
                    product: .app,
                    bundleId: "com.rafa.example",
                    infoPlist: "Info.plist",
                    sources: "Sources/**",
                    dependencies: [
                .external(name: "Alamofire"),
            ])


ワークスペースの構成



Por padrão Project.swift cria um Workspace com o mesmo nome do projeto e já inclui as dedependents.
モノレポでプロジェクトを作成する必要はありません.ワークスペースやプロジェクト プロジェクトを追加するための事前設定は必要ありません.

import ProjectDescription

let workspace = Workspace(
    name: "ProjectWorkspace",
    projects: [
        "Project1",
        "Project2",
        "Project3"
    ],
    schemes: []
)


Por padrão os schemas são gerados automaticamente, mas podem ser personalizados para configurar as ações de cada um.

ゲランド・オス・アルキボス



A configuração é essa,dependendo do tamanho do projeto pode serum pouco cansativa mas os ganhos são compensatórios.

Depois de tudo configurado, é so rodar o tuist generate para baixar asdependências e depois tuist dependencies fetch para gerar os projetos projetos/workspaces.

テストは、Swift と Yaml を使用して、多くの解決策を作成し、モジュールのキャッシュを作成する可能性があります.
xcdiff evitando que o tuist generate fosse alterado manualmente の実装を完了します.

E é isso! :)

リンク集



Tuist.io
Tuist docs
xcdiff