Xcode:在每次直接修改源代码的构建之前运行脚本

ent*_*nto 56 scripting xcode dependencies build

我做了什么:

我有一个脚本

  1. 阅读一些配置文件以生成源代码片段
  2. 查找相关的Objective-C源文件和
  3. 用步骤1中生成的代码替换源代码的某些部分.

和一个Makefile,它有一个特殊的时间戳文件作为make目标,配置文件作为目标源:

SRC = $(shell find ../config -iname "*.txt")
STAMP = $(PROJECT_TEMP_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME).stamp
$(STAMP): $(SRC)
    python inject.py
    touch $(STAMP)
Run Code Online (Sandbox Code Playgroud)

我在项目目标的构建阶段堆栈之上添加了这个Makefile作为"运行脚本构建阶段".

发生了什么:

在编译源代码之前运行了脚本构建阶段.

但是,由于脚本在执行期间修改了源代码,因此我需要构建两次以获取最新版本的构建产品.这是我想象中发生的事情:

  1. 第一次运行:Xcode收集依赖信息--->没有变化
  2. 第一次运行:Xcode运行"运行脚本构建阶段"--->源代码在Xcode的后面更改
  3. 第一次运行:Xcode完成构建,认为没有什么需要更新
  4. 第二次运行:Xcode收集依赖信息--->源已更改,需要重建!
  5. 第二轮:Xcode运行Run Script Build Phase"--->一切都是最新的
  6. 第二轮:Xcode继续编译

在阅读Build Phases上的Xcode文档后,我尝试添加一个源文件,这个源文件在每次运行脚本时都会更新,作为"Run Script Build Phases"的输出,但没有任何改变.由于配置文件的数量可能在我的项目中有所不同,我不想指定每个输入和输出文件.

题:

如何让Xcode知道在"运行脚本构建阶段"期间所做的源文件更改?

编辑:

  • 补充说我在其他构建阶段之前放置了脚本构建阶段

mar*_*osb 83

到目前为止提到的每种技术都是过度杀伤力.再现史蒂夫金的可见性评论:

在构建阶段选项卡中,只需将"运行脚本"步骤拖到更高的位置(例如,在"编译源"之前).

在XCode 6上测试过

  • 根据您尝试更改的文件,此解决方案可能不起作用。例如,如果您正在更新一个 xcconfig 文件或一个 Info.plist 文件,这些文件似乎在任何构建阶段运行之前就已经被消耗掉了,因此脚本内部发生的更改不会显示在构建中。 (4认同)
  • 这对于Xcode 7效果很好。需要注意的一件事是,我无法将阶段向上拖动。我不得不*拖*其他的。 (2认同)
  • @Tokuriku可以向上拖动,但是如果尝试拖动或越过“ Target Dependencies”,则将不起作用。您需要将其拖到它下面。 (2认同)

ent*_*nto 28

这个解决方案可能已经过时了.请参阅较高的投票答案.


使用"外部目标":

  1. 从菜单中选择"Project">"New Target ..."
  2. 选择"Mac OS X">"其他">"外部目标"并将其添加到项目中
  3. 打开其设置并填写脚本设置
  4. 打开主目标设置的"常规"选项卡,并添加新目标,因为它是直接相关性

现在,新的"外部目标" 主目标甚至开始收集依赖性信息之前运行,因此在脚本执行期间所做的任何更改都应包含在构建中.

  • @Abizern:从常见问题解答中,"提问和回答你自己的编程问题也是完美的." 另请参阅:http://stackoverflow.com/questions/18557/how-does-stackoverflow-work-the-unofficial-faq#119658 (28认同)
  • @Abizem我想分享我的发现,正如@htw所说,它在stackoverflow中受到鼓励.为了更清楚地澄清事情,我添加了标签"selfanswer",尽管它可能违背了这种鼓励. (7认同)
  • 这适用于iOS构建的Aggregate目标. (2认同)
  • 您可以在构建阶段之前拖放"运行脚本". (2认同)