使用 xcodegen 管理 iOS 项目,从此摆脱 xcodeproject 的冲突

本文我们将介绍如果通过使用xcodegen,来更有效地来管理 iOS.xcodeproj文件。

那么问题来了,为什么我们要使用 xcodegen,.xcodeprojects 到底有什么问题呢?

Xcode 使用项目文件.xcodeproj文件来捆绑 IDE 的源代码和资源。在大多数情况下都能良好的工作,但是有时候它会暴露出一些缺点来:

  1. 在不同的分支上添加了源码文件或资源后无法确定文件是否正确,虽然说你可以手动去解决.xcodeproj文件中的合并冲突。

  2. 如果想要同步电脑上的文件夹结构或者项目中的group结构,我们往往是通过人工手动来决定,这就难免会造成混淆。幸运的是已经有工具可以来解决这个问题了,比如synxxcodeproj gem的排序功能。

  3. Xcode 只会在编译后才会提示你项目中存在文件的丢失。

  4. 编写依赖关系并构建多个目标的脚本可能会变得非常麻烦。

xcodegen 简介

xcodegen是一个工具,它允许我们从名为project.yml的文件中的定义生成xcodeproj文件。由于xcodeproj文件可以随时生成,我们甚至不必将它保存在我们的git中并且可以忽略它。

以下是xcodegen的两个最重要的功能:

  1. 可以通过这种方式为各种平台(iOS,tvOS,macOS,watchOS)定义各种 Xcode target(application,frameworks 等)。

  2. 它还允许将源文件的文件夹连接到目标,从而更容易管理哪些源代码文件包含在哪个目标中。

虽然xcodegen是一个刚出来不久的项目,但它已经可以做很多事了。接下来就让我们来体验xcodegen带来的快感吧~

安装 xcodegen

通过homebrew安装xcodegen

brew install xcodegen

生成 APP 项目工程

首先,使用 Xcode 创建一个Single View AppiOS 应用程序,以便获得项目起初所有必需的.m.xcassets等文件。

现在我们通过使用project.yml文件来重新创建项目,关闭 Xcode 并在根目录中创建一个project.yml文件,输入以下内容:

name: XcodegenTest # The name of the Appoptions: # Some general settings for the project  createIntermediateGroups: true # If the folders are nested, also nest the groups in Xcode  indentWidth: 2 # indent by 2 spaces  tabWidth: 2 # a tab is 2 spaces  bundleIdPrefix: "de.number42"targets: # The List of our targets  XcodegenTest:    type: application    platform: iOS    deploymentTarget: "10.3"    sources:      #Sources      - path: XcodegenTest

然后,重命名现有的.xcodeproj(稍后我们可以用它来对比通过xcodegen生成的工程的效果是否一样)。

image

接着回到终端,并在项目根目录下输入命令xcodegen并回车:

image

然后回到工程目录,打开刚生成的XcodegenTest.xcodeproj文件,见证奇迹的时刻到了~,跑起来~cmd + run运行项目。“Ah, Build Successed” !,一切都跟之前 xcode 生成的.xcodeproj一样~

image
image
image

生成 TestTargets

project.yml文件中添加如下代码:

 XcodegenApp-iOS-Tests:    type: bundle.unit-test    platform: iOS    deploymentTarget: "10.3"    sources:      - path: XcodegenTestTests    dependencies:      - target: XcodegenTest

同样的先关闭 Xcode( Xcode 比较怪,如果在项目文件打开时去更改项目文件可能就会出现莫名其秒的错误),在命令行输入xcodegen重新生成.xcodeproj文件,然后打开工程,“看吧,你要的TestTargets出来了”,接着cmd + u跑来来。“Ah, Build Successed ~,一切尽在掌控之中~”。

image

添加UI Tests跟上面的操作一样,同样地在project.yml文件中添加如下代码,然后关闭 xcode, 重新生成.xcodeproj

XcodegenApp-iOS-UITests:    type: bundle.ui-testing    platform: iOS    sources:      - path: XcodegenTestUITests    dependencies:      - target: XcodegenTest

如上,就是通过xcodegem来生成TestTargets的过程~

生成 Framework 工程

在 Xcode 中维护子模块总是有点麻烦。使用xcodegen可以轻松将模块化引入您的应用程序。

接下来我们将介绍如何做到这一点,创建一个XcodegenAppFramework,其中包含经典的动物种类:

1)在根目录下创建XcodegenAppFramework目录
2)创建Animal .h/.m,添加如下内容

//Animal.h

import <Foundation/Foundation.h>

@interface Animal : NSObject

  • (void)sayHellow;

  • (NSString *)helloTipTrick;

@end

//Animal.m

import "Animal.h"

import <Foundation/Foundation.h>

@implementation Animal

  • (void)sayHellow {
    NSLog(@"Hello iOS Trick");
    }

  • (NSString *)helloTipTrick {
    return @"关注 "iOS开发技术栈" ,看奇技淫巧";
    }

@end

</pre>

3)在XcodegenAppFramework目录下添加Info.plist文件,并输入相应内容。

⚠️:由于 Info.plist 文件内容过长,在此就不列出该文件的内容了,完整的 Info.plist 内容可以关注微信公众号 “ iOS 开发技术栈” 回复关键字 xcodegen 获得。

4)为XcodegenAppFramework添加project.yml

XcodegenAppFramework:  type: framework  platform: iOS  deploymentTarget: "10.3"  sources:    - path: XcodegenAppFramework

5)为XcodegenTest添加依赖

dependencies:    - target: XcodegenAppFramework

关闭 xcode,回到命令行重新输入xcodegen回车,重新生成.xcodeproj,“Build Successed~”,但是等等,到目前为止,什么也没发生?

ok,接下来让我们来看看能否跟平常一样使用XcodegenAppFramework

6)导入XcodegenAppFramework,在 ViewController 类中添加如下代码:

#import <XcodegenAppFramework/Animal.h>- (void)viewDidLoad {  [super viewDidLoad];  [Animal sayHellow];  self.messageLabel.text = [Animal helloTipTrick];}

接着CMD + R让 Demo 跑起来,一切竟然都跟以前的方式一样~

使用依赖管理工具

xcodegen 可以为每个 target 声明一个或多个依赖项。

Cocoapods

就跟平时使用 podfile 一样。在project.yml中不需要引用pod本身。使用xcodegen生成项目后,只需运行 pod install,它将自动把项目集成并创建 workspace。

Carthage

xcodegen让 Carthage 依赖集成变得非常简单!

只需在 target 中引用它们,xcodegen会在必要时自动链接和嵌入 Carthage frameworks 来完成剩下的工作。下面我们将会通过 Carthage 导入Toast依赖来演示这个操作:

1)安装 carthage

brew install carthage

2)创建一个Cartfile文件

3)添加以下内容

github "scalessec/Toast" ~> 4.0.0

4)carthage update --platform iOS

5)在project.ymlXcodegenTesttarget 依赖中添加一下内容:

- carthage: Toast

6)关闭 Xcode ,并在命令行中执行xcodegen命令,打开项目,并输入如下代码,最后编译并运行项目,一切正常,完美~

#import <Toast/Toast.h>[self.view makeToast:@"Hello iOS Trick" duration:1 position:CSToastPositionCenter];

图 Carthage 依赖运行效果

image

如上,xcodegen的一些基本用法就介绍到这了,当然xcodegen的功能远远不止这些,如果对xcodegen的更多内容感兴趣,请关注我们的公众号iOS 开发技术栈,后面我们也会分享xcodegen的其他用法,敬请期待~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容