美文网首页
使用 xcodegen 管理 iOS 项目,从此摆脱 xcode

使用 xcodegen 管理 iOS 项目,从此摆脱 xcode

作者: 老王技术栈 | 来源:发表于2018-08-10 09:55 被阅读265次

    本文我们将介绍如果通过使用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的其他用法,敬请期待~

    相关文章

      网友评论

          本文标题:使用 xcodegen 管理 iOS 项目,从此摆脱 xcode

          本文链接:https://www.haomeiwen.com/subject/nefkbftx.html