本文我们将介绍如果通过使用xcodegen
,来更有效地来管理 iOS.xcodeproj
文件。
那么问题来了,为什么我们要使用 xcodegen,.xcodeprojects 到底有什么问题呢?
Xcode 使用项目文件.xcodeproj
文件来捆绑 IDE 的源代码和资源。在大多数情况下都能良好的工作,但是有时候它会暴露出一些缺点来:
-
在不同的分支上添加了源码文件或资源后无法确定文件是否正确,虽然说你可以手动去解决
.xcodeproj
文件中的合并冲突。 -
如果想要同步电脑上的文件夹结构或者项目中的
group
结构,我们往往是通过人工手动来决定,这就难免会造成混淆。幸运的是已经有工具可以来解决这个问题了,比如synx
或xcodeproj gem
的排序功能。 -
Xcode 只会在编译后才会提示你项目中存在文件的丢失。
-
编写依赖关系并构建多个目标的脚本可能会变得非常麻烦。
xcodegen 简介
xcodegen
是一个工具,它允许我们从名为project.yml
的文件中的定义生成xcodeproj
文件。由于xcodeproj
文件可以随时生成,我们甚至不必将它保存在我们的git
中并且可以忽略它。
以下是xcodegen
的两个最重要的功能:
-
可以通过这种方式为各种平台(iOS,tvOS,macOS,watchOS)定义各种 Xcode target(application,frameworks 等)。
-
它还允许将源文件的文件夹连接到目标,从而更容易管理哪些源代码文件包含在哪个目标中。
虽然xcodegen
是一个刚出来不久的项目,但它已经可以做很多事了。接下来就让我们来体验xcodegen
带来的快感吧~
安装 xcodegen
通过homebrew
安装xcodegen
brew install xcodegen
生成 APP 项目工程
首先,使用 Xcode 创建一个Single View App
iOS 应用程序,以便获得项目起初所有必需的.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
生成的工程的效果是否一样)。
接着回到终端,并在项目根目录下输入命令xcodegen
并回车:
然后回到工程目录,打开刚生成的XcodegenTest.xcodeproj
文件,见证奇迹的时刻到了~,跑起来~cmd + run
运行项目。“Ah, Build Successed” !,一切都跟之前 xcode 生成的.xcodeproj
一样~
生成 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 ~,一切尽在掌控之中~”。
添加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.yml
的XcodegenTest
target 依赖中添加一下内容:
- 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
的其他用法,敬请期待~
网友评论