版本 1.0.0 的 KZBootstrap

KZBootstrap 1.0.0

测试已测试
语言编程语言 Obj-CObjective C
许可证 MIT
发布上次发布2018年3月

Krzysztof ZablockiKrzysztof Zabłocki维护。



iOS项目启动

您是如何配置iOS项目的?

由于我们将进入2015年,我正在刷新我的项目启动器。我决定开源,以便其他人从中受益或做出贡献。

我认为这很酷,但请自行判断。

它仍然是WIP(工作进行中),所以非常欢迎更改请求。

基本设置和配置

默认情况下,项目有3种配置

  1. 调试
  2. 发布
  3. Adhoc

每种配置都可以放在同一设备上,并且可以清楚地区分每个构建。更容易在不同版本和分支中找到问题。

查看每个图标可以得到以下信息

  • 构建号:29
  • 分支:Master
  • 提交哈希值
  • 版本:1.0
    • 构建应用的配置

您还可以使用KZBootstrap API在运行应用程序时查询这些信息。

代码质量和警告

编译器团队添加警告是有原因的,因此我从Weverything开始,禁用了一些警告

  • Wno-objc-missing-property-synthesis - 不希望对属性进行@synthesize
  • Wno-unused-macros - 当执行DSL时很讨厌
  • Wno-disabled-macro-expansion - 需要用于DSL/元编程
  • Wno-gnu-statement-expression - 有帮助
  • Wno-language-extension-token - 语言扩展是有用的
  • Wno-overriding-method-mismatch - 这样我就可以将id更改为特定类型并避免不必要的局部变量

将警告视为错误是必须的。

这还不是全部,让我们添加一些脚本

  • 将所有todo/fixme转换为警告
  • 当文件过大时给出警告
    • 在文件中任何地方添加KZBIgnoreLineCount以禁用该文件的警告生成。
  • 自动为当前开发者生成宏,这样团队可以在开发功能时有不同的代码路径,或者有不同的日志级别。无需git更改。
    #if merowing
    //! my code
    #endif 

还有一件事,我们来定义一些宏:为了防止传递nil作为参数

  • KZB_REQUIRE_ALL_PARAMS
  • KZB_REQUIRE_PARAMS(1,2)

当你需要子类调用超类时

  • KZB_REQUIRE_SUPER

当你想要避免拼写错误时

  • KZB_KEYPATH
  • KZB_KEYPATH_T

环境配置

通常在为大型客户工作时,你需要为预发布/生产/质量控制等创建多个环境。它们通常在某种配置上有所不同,例如不同的URL端点。

很多时候,我看到人们为每一个分别创建单独的目标,这会导致维护成本和不需要的 bloating / clutter。

因此,我创建了一种不同的方法,其中包含一些很好的自动化。

  • 默认环境可以通过 xcodebuild 用户变量(在 Jenkins 上)或通过 schema 内部的启动参数进行更改。
    • 在 Jenkins 上,xcodebuild … KZBEnv=@”生产”构建
    • 在自定义 Scheme 中:编辑 Scheme -> 参数 -> 启动参数 -> “-KZBEnvOverride 生产”
  • 无需重新安装应用程序,即使它在运行时,也可以更改环境。
  • 所有环境变量都创建在一个单一的 plist 中
    • 如果您在某个环境的变量条目中缺失了变量,您将得到 编译时错误。您甚至可以点击它进入配置文件。
    • 设置捆绑包将被 自动注入 以供您切换环境。
    • 您可以在环境更改时注册回调,这对于您需要重置数据库等很有用。
    • 生产构建将删除其他环境的所有变量,以防止暴露非生产和非使用配置。

日志记录 - 可选

如果您正在使用 CocoaLumberjack,您可以包含 KZBootstrap/Logging 子规范以获取在 AppCode 中作为可点击链接工作的日志格式化。

调试 - 可选

如果您决定包含 KZBootstrap/Debug 子规范,您将得到

  • 当 UIKit 在后台线程上布局/显示时,断言,这样您就可以修复您的代码。
  • AFNetworking 的 API 拦截功能,您可以自己显示(或发送带有通用 UI 的 PR 给我)。或者只需在调试时调用它查看
[KZBResponseTracker printAll]

安装 KZBootstrap

KZBootstrap 通过 CocoaPods 提供。要安装它,只需将以下行添加到您的 Podfile 中

  • KZBootstrap - 核心功能
  • KZBootstrap/Logging - 额外的日志记录功能
  • KZBootstrap/Debug - 额外的调试功能

您需要对项目执行一些操作,您可以使用我的 crafter 设置工具使其自动完成,也可以手动完成。

  • KZBEnvironments.plist,包含所有环境的数组,所有额外的键都视为环境变量,并且应该为每个允许的环境提供一个值。
  • BUNDLE_DISPLAY_NAME_SUFFIX 和 BUNDLE_ID_SUFFIX 应该添加到用户自定义设置中
    • 在您的目标 .plist 文件中后续添加显示名称和捆绑标识符键,例如 app${BUNDLE_DISPLAY_NAME_SUFFIX}
  • 为每个配置添加一个名为KZBEnv的用户自定义设置,值为默认环境,然后在预处理器宏中添加KZBDefaultEnv=${KZBEnv}
  • 在任何地方创建一个名为KZBootstrapUserMacros.h的空文件,并将其包含到你的*prefix.pch文件中。在.gitignore中包含该文件。
  • 设置警告,如上所述。
  • 你的项目中应该有Settings.bundle文件,以便代码可以注入环境切换功能。
  • 在Build Phases的末尾添加脚本执行"${SRCROOT}/Pods/KZBootstrap/Pod/Assets/Scripts/bootstrap.sh"。你可以通过传递参数到bootstrap.sh来选择性启用功能
    • -l将启用行计数警告
    • -t将启用TODO警告
    • -u将启用用户宏
    • -n将启用构建编号自动化
    • -i将启用图标版本控制。(这也会启用构建编号自动化。)

基本crafter设置可能如下所示,将CUSTOM替换为你喜欢的步骤

# All your configuration should happen inside configure block
Crafter.configure do

  # This are projects wide instructions
  add_platform({:platform => :ios, :deployment => 7.0})
  add_git_ignore
  duplicate_configurations({:adhoc => :release})

  # set of options, warnings, static analyser and anything else normal xcode treats as build options
  set_options %w(
    RUN_CLANG_STATIC_ANALYZER
    GCC_TREAT_WARNINGS_AS_ERRORS
  )

  set_build_settings({
    :'WARNING_CFLAGS' => %w(
    -Weverything
    -Wno-objc-missing-property-synthesis
    -Wno-unused-macros
    -Wno-disabled-macro-expansion
    -Wno-gnu-statement-expression
    -Wno-language-extension-token
    -Wno-overriding-method-mismatch
    ).join(" ")
  })

  set_build_settings({
    :'BUNDLE_ID_SUFFIX' => '.dev',
    :'BUNDLE_DISPLAY_NAME_SUFFIX' => 'dev',
    :'KZBEnv' => 'QA'
  }, configuration: :debug)

  set_build_settings({
    :'BUNDLE_ID_SUFFIX' => '.adhoc',
    :'BUNDLE_DISPLAY_NAME_SUFFIX' => 'adhoc',
    :'KZBEnv' => 'QA'
  }, configuration: :adhoc)

  set_build_settings({
    :'BUNDLE_ID_SUFFIX' => '',
    :'BUNDLE_DISPLAY_NAME_SUFFIX' => '',
    :'KZBEnv' => 'PRODUCTION'
  }, configuration: :release)

  # CUSTOM: Modify plist file to include suffix and displayname
  # CUSTOM: Add empty KZBootstrapUserMacros.h file to your project and .gitignore
  # CUSTOM: Add KZBEnvironments.plist with list of your environments under KZBEnvironments key

  # target specific options, :default is just a name for you, feel free to call it whatever you like
  with :default do

    # each target have set of pods
    pods << %w(KZAsserts KZBootstrap KZBootstrap/Logging KZBootstrap/Debug)

    # add build script for bootstrap
    scripts << {:name => 'KZBootstrap setup', :script => '"${SRCROOT}/Pods/KZBootstrap/Pod/Assets/Scripts/bootstrap.sh"'}

  end
end

如果你想支持动态环境切换的app delegate,可以添加类似的内容

 NSLog(@"user variable = %@, launch argument %@", @"d", [[NSUserDefaults standardUserDefaults] objectForKey:@"KZBEnvOverride"]);
  KZBootstrap.defaultBuildEnvironment = KZBEnv;
  KZBootstrap.onCurrentEnvironmentChanged = ^(NSString *newEnv, NSString *oldEnv) {
    NSLog(@"Changing env from %@ to %@", oldEnv, newEnv);
  };
  [KZBootstrap ready];

  NSLog(@"KZBootstrap:\n\tshortVersion: %@\n\tbranch: %@\n\tbuildNumber: %@\n\tenvironment: %@", KZBootstrap.shortVersionString, KZBootstrap.gitBranch, @(KZBootstrap.buildNumber), KZBootstrap.currentEnvironment);

许可协议

KZBootstrap可用在MIT许可协议下。有关更多信息,请参阅LICENSE文件。

作者

Krzysztof Zablocki,[email protected]

我的博客

在Twitter上关注我。

贡献

如果没有这样一个伟大的社区,这一切都是不可能的。试图列出所有引用,但如果您认为我遗漏了某些内容 请告诉我

参考资料

http://stackoverflow.com/questions/10497552/how-to-configure-independent-sets-of-runtime-settings-in-xcode

https://github.com/crushlovely/Amaro

https://github.com/crushlovely/Sidecar

http://swwritings.com/post/2013-05-20-concurrent-debug-beta-app-store-builds

https://gist.github.com/dulaccc/a52154ac4c007db2be55

https://gist.github.com/steipete/5664345

http://blog.manbolo.com/2013/05/17/passing-user-variable-to-xcodebuild

http://blog.jaredsinclair.com/post/97193356620/the-best-of-all-possible-xcode-automated-build

https://github.com/krzysztofzablocki/crafter

https://github.com/krzysztofzablocki/IconOverlaying

非常感谢Lextech Global Services对我社区工作的支持,他们很棒。如果您需要一个企业的移动应用,您应该和他们谈谈。