美文网首页
iOS XcodeGen使用参考

iOS XcodeGen使用参考

作者: 一粒咸瓜子 | 来源:发表于2021-08-08 18:01 被阅读0次

资料

XcodeGen--Github
Better iOS projects: Getting (nearly) rid of Xcodeproject - A (not so) short Introduction to Xcodegen
Xcodegen构建Xcode Project

痛点

Xcode 使用项目文件 .xcodeproj 文件来捆绑 IDE 的源代码和资源。在大多数情况下是正常工作的,但它有以下几个缺点:

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

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

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

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

简介

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

两个最重要的功能:

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

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

另一种脚本生成 .xcodeproj 的方式是 gem xcodeproj

安装

使用 homebrew 安装

brew install xcodegen

或使用 mint 安装(mint 是一个包管理器

mint install yonaskolb/xcodegen

project.yml

格式

ProjectSpec.md#include

在项目的根目录下创建 project.yml 文件。

cd path/
touch project.yml
open project.yml

文件内容:

name: AppName # 工程名
options: # 项目的一些常规配置
  bundleIdPrefix: com.abc # 假定 BundleID: com.abc.project
  developmentLanguage: zh-Hans # 可选
settings:
  DEVELOPMENT_TEAM: ASJDAJS  # 需要去 developer.apple.com 后台获取
# 上面是 PROJECT 文件中的配置
# 下面是 TARGETS 文件中的配置
targets: 
  AppName:
    type: application
    platform: iOS
    deploymentTarget: "10.3"
    sources:
     #Sources
      - subModule # 可选,如果项目有其他 module:例如 FileUpload-iOS/FileUpload
      - path: AppName # 主项目
    dependencies: # 可选,如果项目依赖某些静态库,如果依赖某些动态库 例如 NetworkExtension,方法见下
      - framework: AppName/apath/bpath/cpath/xxx.framework
      - sdk: CoreData.framework # 动态库可使用 sdk 类型添加
      - sdk: libsqlite3.tbd
    settings:
        INFOPLIST_FILE: AppName/apath/Info.plist # 生成 info.plist
        GCC_PREFIX_HEADER: AppName/apath/PrefixHeader.pch # pch 文件路径
        # OTHER_LDFLAGS: "$(inherited) -framework CoreData" # 可选, 如果 "sdk:" 方式无法添加动态库 可尝试这种方式
        PRODUCT_BUNDLE_IDENTIFIER: M.Practice
        
  • options - developmentLanguage: 如果不同分支上的项目生成不同 App,例如 cn-release 打包 CNAPP,kr-release 打包 KRAPP,且它们 Localization 中 Development Languagae 各不相同时,需要在每个分支上配置不同的参数。


  • targets - AppName - sources - path - excludes: 添加需要排除的文件

  • targets - AppName - settings:对应的是 TARGETS - Build Settings 中的配置

    • OTHER_LDFLAGS: Other Linker Flags,添加动态库

问题

  • 1> project.pbxproj 每次都变更
    因为文件是由 xcodegen 生成出来的,所以此文件不需要纳入管理。
    在 .gitignore 文件中忽略不掉的原因:该文件之前已经在暂存区了,所以忽略不掉,需要执行 git rm 将它从暂存区删掉。
git rm /path/Practice/Practice.xcodeproj/project.pbxproj 
  • 2> Missing Localizability


解决方法:目前先放着不管,因为解决办法全是基于修改.xcodeproj的,xcodegen每次重新生成文件,修改就会被重置掉。
https://github.com/CocoaPods/CocoaPods/issues/8494

  • 3> Remove Duplicate References in Build Phase



    解决办法:添加 excludes,在项目中排除静态库


  • 4> pod update 阶段警告


解决办法:


  • 5> Main Thread Checker 设置
    在更新 Xcode 之后,NerdyUI 必须取消 Main Thread Checker 才可以使用 .color 方法


  • 6> Parsing project spec failed: Decoding failed at "type": Nothing found


解决办法:一定要 project.yml 文件中各项的对齐情况,十分严格

  • 7> 本地化文件成散装的
    最好将 .string 文件放在 Localized 文件夹下,不要放在根目录中。

生成 TestTargets

如果原项目包含 Tests 和 UI Tests,可以在 project.yml 文件中添加 target

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

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

用法

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

options:

  • --spec: .yml或.json项目规范的可选路径。默认为project.yml
  • --project: 生成项目的目录的可选路径。默认情况下是所在的目录。
  • --quiet: 禁止显示信息和成功消息。
  • --use-cache: Used to prevent unnecessarily generating the project. If this is set, then a cache file will be written to when a project is generated. If xcodegen is later run but the spec and all the files it contains are the same, the project won't be generated.
  • --cache-path: A custom path to use for your cache file. This defaults to ~/.xcodegen/cache/{PROJECT_SPEC_PATH_HASH}

优化脚本:

vim setup.sh
i
xcodegen && pod update --no-repo-update
esc
:wq

执行脚本:

sh setup.sh

增加忽略

  • 忽略 project.pbxproj:
    因为文件是由 xcodegen 生成出来的,所以此文件不需要纳入管理。
    在 .gitignore 文件中忽略不掉的原因:该文件之前已经在暂存区了,所以忽略不掉,需要执行 git rm 将它从暂存区删掉。
git rm /path/Practice/Practice.xcodeproj/project.pbxproj 
  • 其他忽略
*.xcworkspace
*.xcodeproj
.DS_Store

模板

name: Practice
options:
  bundleIdPrefix: "M"
  developmentLanguage: en
settings:
  DEVELOPMENT_TEAM: T265XVEUYV
targets:
  Practice:
    type: application
    platform: iOS
    deploymentTarget: "13.0"
    sources:
      - path: Practice
        excludes:
          - "MyFrameW.framework"
    dependencies:
      - framework: Practice/MyFrameW.framework
      - sdk: CoreData.framework
      - sdk: libsqlite3.tbd
      - sdk: NetworkExtension.framework
    settings:
        INFOPLIST_FILE: Practice/Info.plist
        GCC_PREFIX_HEADER: Practice/PrefixHeader.pch
        PRODUCT_BUNDLE_IDENTIFIER: M.Practice
    scheme:
        disableMainThreadChecker: true

相关文章

网友评论

      本文标题:iOS XcodeGen使用参考

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