【2019年版】チームが幸せなiOSプロジェクトの作り方

# はじめに

チーム開発向けのプロジェクトキッティング

# やりたいこと

チーム開発の時のコンフリクト絶対許さないプロジェクトの誕生を祝いたい


# 使うもの

- XcodeGen
- CocoaPods（Carthageの場合は臨機応変に）
- xcconfig-extractor
- MacOS 10.14.5 以上
- Xcode 10.2 以上
- .gitignore
- SwiftLint

# 使用上の注意

※自己責任

# 下準備
## １、XcodeGenのインストール

```terminal
$ brew install xcodegen

# インスコ確認
$ xcodegen --help
Usage: xcodegen generate [options]

Generate an Xcode project from a spec
＜以下、省略＞
```

## ２、CocoaPodsのインストール

```terminal
$ brew install cocoapods

# インスコ確認
$ pod --version
1.6.1(適宜)
```

## ３、xcconfig-extractorのインストール

~~brewで入れられなかったの悔しい~~

```terminal
$ bash <(curl -sL https://raw.githubusercontent.com/toshi0383/scripts/master/swiftpm/install.sh) toshi0383/xcconfig-extractor

# バージョン確認
xcconfig-extractor --version
0.5.0
```

# 準備

## 1、xcodeで新規プロジェクト作る
 
## 2、swift5にアップ

Build Settings -> swiftで検索してSwift Language Versionを`Swift 5`にする

## ３、xcconfigの作成

commmand一発でやってくれるので楽チン

```shell-session
$ xcconfig-extractor {prj_dir}/{prj_name}.xcodeproj configs
```

## ４、project.ymlの作成

下記をコピって<project name>をエディタかなんかで自分のプロジェクト名に全置換
作成したらREADMEとかに置いてある階層に設置


```project.yml

name: <project name>
fileGroups:
  - configs
configFiles:
  Debug: configs/Debug.xcconfig
  Release: configs/Release.xcconfig
targets:
  <project name>:
    type: application
    platform: iOS
    sources: <project name>
    configFiles:
      Debug: configs/<project name>-Debug.xcconfig
      Release: configs/<project name>-Release.xcconfig
    settings:
      CURRENT_PROJECT_VERSION: 1
    scheme:
      testTargets:
        - <project name>Tests
        - <project name>UITests
  <project name>Tests:
    type: bundle.unit-test
    platform: iOS
    sources: <project name>Tests
    configFiles:
      Debug: configs/<project name>Tests-Debug.xcconfig
      Release: configs/<project name>Tests-Release.xcconfig
    dependencies:
      - target: <project name>
  <project name>UITests:
    type: bundle.ui-testing
    platform: iOS
    sources: <project name>UITests
    configFiles:
      Debug: configs/<project name>UITests-Debug.xcconfig
      Release: configs/<project name>UITests-Release.xcconfig
    dependencies:
      - target: <project name>
```

## ５、xcodeprojファイルの作成

```terminal
$ xcodegen
```

# .gitignoreとの戦い編

## １、.gitignore作成

[gitignore.io](https://www.gitignore.io/)で作成する

[今回使用したのはXcode、macOS、Swiftの３つ](https://www.gitignore.io/api/swift,xcode,macos)

エディタでファイル作ったらコピペ
プロジェクトディレクトリに置く


## ２、.gitignoreのカスタマイズ

75行目くらいのCocoaPodsのところ

```vim
 75 # CocoaPods
 76 # We recommend against adding the Pods directory to your .gitignore. However
 77 # you should judge for yourself, the pros and cons are mentioned at:
 78 # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
 79 # Pods/
 80 # Add this line if you want to avoid checking in source code from the Xcode workspace
 81 # *.xcworkspace
```

79行目、81行目の#を削除でこんにちわ

```vim
 75 # CocoaPods
 76 # We recommend against adding the Pods directory to your .gitignore. However
 77 # you should judge for yourself, the pros and cons are mentioned at:
 78 # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
 79 Pods/
 80 # Add this line if you want to avoid checking in source code from the Xcode workspace
 81 *.xcworkspace
```

116行目くらいのXcode Patchのところ

```vim
116 ### Xcode Patch ###
117 *.xcodeproj/*
118 !*.xcodeproj/project.pbxproj
119 !*.xcodeproj/xcshareddata/
120 !*.xcworkspace/contents.xcworkspacedata
```

119行目の`!*.xcodeproj/project.pbxproj`の!を削除

```vim
116 ### Xcode Patch ###
117 *.xcodeproj/*
118 *.xcodeproj/project.pbxproj
119 !*.xcodeproj/xcshareddata/
120 !*.xcworkspace/contents.xcworkspacedata
```

## ３、CocoaPodsをセットアップ

結構時間かかる

```terminal
$ pod setup
```
## ４、Podfileを作成

プロジェクトディレクトリでチャカチャカターン！

```terminal
$ pod init
```

## ５、Podfileを編集

- 2行目のplatformのコメントアウト外してビルドターゲット入れないと`xcodegen + pod install`でエラー出る
- 6行目の`use_frameworks!`のコメントアウト外す
- とりまSwiftLint入れる

```vim
  1 # Uncomment the next line to define a global platform for your project
  2 platform :ios, '12.0'
  3
  4 target '<project name>' do
  5   # Comment the next line if you're not using Swift and don't want to use dynamic frameworks
  6   use_frameworks!
  7
  8   # Pods for <project name>
  9   pod 'SwiftLint'
 10
 11   target '<project name>Tests' do
 12     inherit! :search_paths
 13     # Pods for testing
 14   end
 15
 16   target '<project name>UITests' do
 17     inherit! :search_paths
 18     # Pods for testing
 19   end
 20
 21 end
```

## ６、SwiftLint導入

```terminal
$ pod install

# ここで以下が自動生成される

Podfile.lock
Pods/
.xcworkspace
```

## ７、Xcodeでビルド通るか確認する

ビルド通れば幸せでgit push
ビルド通ってなければ参考記事[.gitignoreを後から適用する手順](https://qiita.com/hsylife/items/287081ae58788fcc34f2)を使って頑張る

Podfile.lockは@mono0926さんの記事[CocoaPods・Carthageでインストールした成果物はバージョン管理に含めるべきか？](https://qiita.com/mono0926/items/636819c42e96a8c4e12d)を読んで監視することにしました


# git監視から外すのは以下3つ

1. Pods/
2. .xcworkspace
3. [project name].xcodeproj/project.pbxproj

# 運用

## ライブラリを追加する時＜2019年8月16日追記＞

＜NGケース＞

```terminal
$ pod install
$ xcodegen
```
上記だとXcode上の設定が変わって大変な思いをしました
podでインストールしたはずのライブラリを認識してくれず `Dyld Error` が出まくりでストレスMAXになりました
[【参考】：Library not loaded エラー？ここを見直そう](https://qiita.com/kakipo/items/3cd87e00bc96bc3888b2)

解決方法としてはxcodegenをしてからpod installをすると不幸が去って行きました
＜OKケース＞

```terminal
$ xcodegen
$ pod install
```


これだけでチームが幸せ☺️

# 参考記事

[Xcodegenを導入しました。](https://medium.com/pococha-engineering/xcodegen%E3%82%92%E5%B0%8E%E5%85%A5%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F-4f4d405deb3b)
[XcodeGenを導入してハマったこと](https://qiita.com/417_72ki/items/b23db0e26ae740d1132d)