从podspec添加运行脚本构建阶段到Xcode项目

32

我正在尝试为我的库编写Cocoapods规范,该规范必须修改Xcode项目并向项目的目标添加“运行脚本构建阶段”。 我想我可以使用post_install hook。 但是,“pod spec lint”说这个hook已经被弃用:

- WARN  | [iOS] The post install hook of the specification DSL has been deprecated, use the `resource_bundles` or the `prepare_command` attributes.

我不知道如何用*resource_bundles*或*prepare_command*来替换post_install钩子。 谁知道其他方法来解决我的问题?这是可能的吗?

另一个问题是如何修改Xcode项目以添加构建阶段,但仅在“post_hook问题”得到解决时才会实际发生作用。

2个回答

41
使用Xcodeproj ruby gem(Cocoapods的一部分)编写脚本来修改您的Xcode项目。 然后使用prepare_command调用此脚本。
require 'xcodeproj'
path_to_project = "${SOURCE_ROOT}/${PROJECT_NAME}.xcodeproj"
project = Xcodeproj::Project.open(path_to_project)
main_target = project.targets.first
phase = main_target.new_shell_script_build_phase("Name of your Phase")
phase.shell_script = "do sth with ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/your.file"
project.save()

文档:http://rubydoc.info/gems/xcodeproj

您可以通过运行以下命令获取构建设置变量及其值的列表...

xcodebuild -project [ProjectName].xcodeproj -target "[TargetName]" -showBuildSettings

更新: 自回答此问题以来,有些事情已经发生了变化。关于访问环境变量的问题正在这里讨论:https://github.com/CocoaPods/CocoaPods/issues/2115


1
有没有一种简单的方法来设置 path_to_project?我希望我的 pod 的用户只需运行 pod install,就可以为他们配置好一切。 - GuidoMB
1
@GuidoMB,你可以这样做:current_pwd="$PWD"; project_dir=\cd "../../"; pwd`; cd "$current_pwd"`,项目目录路径是存储在变量project_dir中的。然后,在你的Ruby代码中使用它,例如通过将其作为参数传递。我创建了一个gist,其中包括.xcodeproj文件的路径示例,网址为https://gist.github.com/niklasberglund/4534113ce7db9572e772。 - Niklas Berglund
1
这一切都很好,但是在错误的目录中。我只能让它在Library/Caches/CocoaPods/Pods/...执行,但无法在项目的实际Pods目录中执行。你有什么想法我漏掉了什么吗? - CodyMace
1
我需要设置SOURCE_ROOTPROJECT_NAME吗?因为我得到了[Xcodeproj] Unable to open /Users/.../projects/git/.../${SOURCE_ROOT}/${PROJECT_NAME}.xcodeproj because it doesn't exist.的错误提示,所以我想知道是否需要设置这两个参数。 - swalkner
1
我遇到了相同的问题。这是在我调用pod install时发生的。 - Liron
显示剩余9条评论

0

完整指南可以在这里找到:https://blog.cocoapods.org/CocoaPods-1.4.0/

但是简短的版本,您可以像这样添加构建阶段脚本:

s.script_phase = {
  :name => 'Hello World',
  :script => 'echo "Hello World"',
  :execution_position => :before_compile
}

如果你想执行一个 shell 脚本,可以使用以下语法:(你的文件应该是可执行的 chmod +x setup.sh
s.script_phases = [
  { :name => 'Precompile',
    :script => '${PODS_TARGET_SRCROOT}/setup.sh',
    :execution_position => :before_compile
  }
]

如果您想添加多个脚本,可以像这样操作:
s.script_phases = [
  { :name => 'Precompile',
    :script => '${PODS_TARGET_SRCROOT}/setup.sh',
    :execution_position => :before_compile
  },
  { :name => 'Postcompile',
    :script => 'echo "yay!"',
    :execution_position => :after_compile
  }
]

注意:不要忘记保留脚本文件的路径: s.preserve_paths = '{path}/setup.sh'


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接