【Swift】XcodeGenの使い方!プロジェクト(.xcodeproj)管理ツール

この記事からわかること

  • XcodeGen使い方導入方法
  • プロジェクトファイル(.xcodeproj)の管理方法
  • project.yml記述方法
  • Cannot code sign because the target does not have an Info.plist file and one is not being generated automatically解決

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

公式リファレンス:yonaskolb/XcodeGen

XcodeGenとは?

XcodeGenとはXcodeのプロジェクトファイル(.xcodeproj)を自動生成するコマンドラインツールです。1人での開発では発生しにくいですが、共同開発をする際にプロジェクトファイル(.xcodeproj)がコンフリクトすることがあり、その解消はややこしくわかりづらい部分が多いです。

XcodeGenを使用することでプロジェクトファイル(.xcodeproj)の設定情報を別のYAML形式のテキストファイルとして保持しておくことでそのファイルを元に何度でもプロジェクトファイル(.xcodeproj)を自動生成できるようになります。中身も見やすいためコンフリクトが起きても修正が容易く、誰でも同じ設定のプロジェクトファイル(.xcodeproj)が生成できるので環境の違いが生まれにくくなります。

設定できること

XcodeGenで生成するYAML形式のテキストファイルは「project.yml」になっていることが多いです。このファイル内にプロジェクトの設定を自身で記述していく必要があります。

設定できること

設定できることが多岐に渡りますが、それぞれ細かい記法があるので詳細は公式リファレンスを確認してください。

公式リファレンス:Project Spec

導入方法

XcodeGenはコマンドラインツールなのでプロジェクトごとにではなく、ターミナルに導入していきます。導入するにはパッケージ管理システムであるHomebrewmintなどを使用します。

Homebrew

$ brew install xcodegen

mint

$ mint install yonaskolb/xcodegen

Mintを使用する場合はコマンドの前にmint run [パッケージ名]をつける必要があるので注意してください。

project.ymlの設置

project.yml」は自動生成されないので自分で用意する必要があり余す。プロジェクト内に移動し以下コマンドで空のファイルを生成します。

$ touch project.yml

中に以下のようにXcodeプロジェクトで必要な情報を記述します。細かいところは後述します。


# プロジェクト名
name: XcodeGenTest
# バンドルID
options:
  # バンドルプレフィックス
  bundleIdPrefix: com.dev
  # LocalizationsのDevelopment Languageを指定
  developmentLanguage: ja
  
# ターゲットごとの設定
targets:
  XcodeGenTest:
    # ターゲットの製品タイプ
    type: application
    # ターゲットのプラットフォーム
    platform: iOS
    # デプロイメントターゲット
    deploymentTarget: "15.0"
    sources:
      - XcodeGenTest
    info:
      path: XcodeGenTest/Info.plist
      properties:
        CFBundleVersion: $(CURRENT_PROJECT_VERSION)
        CFBundleShortVersionString: $(MARKETING_VERSION)
        LSRequiresIPhoneOS: YES
        UILaunchScreen: ""
        UIApplicationSupportsIndirectInputEvents: YES
        UIApplicationSceneManifest:
          UIApplicationSupportsMultipleScenes: YES
        UISupportedInterfaceOrientations~iphone:
          [UIInterfaceOrientationPortrait, UIInterfaceOrientationLandscapeLeft, UIInterfaceOrientationLandscapeRight]
        UISupportedInterfaceOrientations~ipad:
          [UIInterfaceOrientationPortrait, UIInterfaceOrientationPortraitUpsideDown, UIInterfaceOrientationLandscapeLeft, UIInterfaceOrientationLandscapeRight]

settings:
  base:
    MARKETING_VERSION: 1.0.0
    CURRENT_PROJECT_VERSION: 1
    DEVELOPMENT_TEAM: XXXXXXXXXX

プロジェクトファイル(.xcodeproj)の自動生成

project.yml」を設置できたらxcodegen generateコマンドを使用してプロジェクトファイル(.xcodeproj)を生成します。すでに存在する場合でも自動生成されたものに置き換わります。

$ xcodegen generate
// Mintの場合
$ mint run xcodegen xcodegen generate

成功すると以下のようなログが出力されます。

🌱 Finding latest version of xcodegen
🌱 Running xcodegen 2.37.0...
⚙️  Generating plists...
⚙️  Generating project...
⚙️  Writing project...
Created project at 省略/XcodeGenTest/XcodeGenTest.xcodeproj

これで生成が完了したのでプロジェクトファイルを開いてみてください。正常にビルドできるはずです。

※「Cannot code sign because the target does not have an Info.plist file and one is not being generated automatically」というエラーが出たらこちらを確認してください。

project.ymlに設定できる値と記述方法

基本的にビルドするために必要な設定を紹介していきます。詳細は公式リアファレンスを参照してください。

公式リファレンス:Project Spec

プロジェクト名

name: XcodeGenTest

BundleID

BundleIDはbundleIdPrefixで始まり部分のみを指定でき、プロジェクト名と繋がり、com.dev.XcodeGenTestとなります。

# バンドルID
options:
  # バンドルプレフィックス
  bundleIdPrefix: com.dev

Localizations

プロジェクトのLocalizationsもここから指定できます。

options:
  # LocalizationsのDevelopment Languageを指定
  developmentLanguage: ja

ターゲット

プロジェクト内のターゲットごとに細かい設定を変更できます。sourcesがないとターゲットがどこのディレクトリ内を参照したら良いか識別できないので忘れないようにしてください。

# ターゲットごとの設定
targets:
  XcodeGenTest:
    # ターゲットの製品タイプ
    type: application
    # ターゲットのプラットフォーム
    platform: iOS
    # デプロイメントターゲット
    deploymentTarget: "15.0"
    sources:
      - XcodeGenTest

info.plist

info.plist内のキーと値も設定することが可能です。Swift UIでXcodeGenを使用してみたところ、明示的にinfo.plistの設定を記述しないとエラーになるようです。これはSwift UIにはデフォルトで「info.plist」が存在しないことが原因のようです。

info:
      path: XcodeGenTest/Info.plist
      properties:
        CFBundleVersion: $(CURRENT_PROJECT_VERSION)
        CFBundleShortVersionString: $(MARKETING_VERSION)
        LSRequiresIPhoneOS: YES
        UILaunchScreen: ""
        UIApplicationSupportsIndirectInputEvents: YES
        UIApplicationSceneManifest:
          UIApplicationSupportsMultipleScenes: YES
        UISupportedInterfaceOrientations~iphone:
          [UIInterfaceOrientationPortrait, UIInterfaceOrientationLandscapeLeft, UIInterfaceOrientationLandscapeRight]
        UISupportedInterfaceOrientations~ipad:
          [UIInterfaceOrientationPortrait, UIInterfaceOrientationPortraitUpsideDown, UIInterfaceOrientationLandscapeLeft, UIInterfaceOrientationLandscapeRight]

上記は以下の記事を参考にさせていただきました。

GitHub:マクネコアユ/SwiftUISampleWithXcodeGen

バージョンやビルド番号

プロジェクト内でのアプリのバージョンやビルド番号、開発チームは以下のように指定できます。

settings:
  base:
    MARKETING_VERSION: 1.0.0
    CURRENT_PROJECT_VERSION: 1
    DEVELOPMENT_TEAM: XXXXXXXXXX

Cannot code sign because the target does not have an Info.plist file and one is not being generated automatically

Swift UIでXcodeGenを使用中にビルドしようとしたら以下のようなエラーが発生しました。

Cannot code sign because the target does not have an Info.plist file and one is not being generated automatically. Apply an Info.plist file to the target using the INFOPLIST_FILE build setting or generate one automatically by setting the GENERATE_INFOPLIST_FILE build setting to YES (recommended).

翻訳

ターゲットに Info.plist ファイルがなく、自動的に生成されていないため、コード署名できません。 INFOPLIST_FILE ビルド設定を使用してターゲットに Info.plist ファイルを適用するか、GENERATE_INFOPLIST_FILE ビルド設定を YES (推奨) に設定して Info.plist ファイルを自動的に生成します。

これはSwift UIにはデフォルトで「info.plist」が存在しないことが原因のようで明示的にinfo.plistの設定をproject.ymlに記述しないとエラーになるようです。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index