Xcode目标阶段Python脚本

2024-10-01 13:29:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试将Python脚本添加到我的项目中,以直接从Git获取构建和市场营销编号。在

我创建了一个新的目标阶段,它运行一个脚本,如:
http://yeahrightkeller.com/2008/10/19/xcode-run-script-build-phase-tip/

我写了一个Python脚本来解析程序信息列表使用

from Foundation import NSMutableDictionary

但是,脚本在编译时失败,并向生成结果报告以下错误:

^{pr2}$

显然,distutils以某种方式硬编码为它是为10.6版(我正在使用的是雪豹)编译的,但是该项目将MacOSX部署目标设置为10.5。在

如果我尝试将项目中的此变量设置为10.6,则会得到:

ld: library not found for -lcrt1.10.6.o

有什么办法解决这个问题吗?提前谢谢。在


Tags: 项目rungitbuild脚本comhttp目标
3条回答

在这个脚本中,您可以简单地将MACOSX_DEPLOYMENT_TARGET的值临时设置为10.6。所以你的命令是:

env MACOSX_DEPLOYMENT_TARGET=10.6 gitversion.py

我也有同样的问题,我希望保留python版本,因为通过NSMutableDictionary处理plist比在Info.plist上使用regex要好得多。在

基于Maxence的回答,解决方案是将python代码从运行脚本构建阶段剥离到gitversion.py文件中:

#!/usr/bin/env python
import os
from Foundation import NSMutableDictionary
from subprocess import Popen, PIPE

p = Popen(
        "/sw/bin/git rev-parse --short HEAD", 
        stdout=PIPE, 
        close_fds=True,
        shell=True)

version = p.stdout.read()
print version
info = os.environ['INFOPLIST_FILE']
print info
plist = NSMutableDictionary.dictionaryWithContentsOfFile_(info)
print plist
plist['revision'] = version[:-1]
plist.writeToFile_atomically_(info, 1)

然后将原始运行脚本替换为shell脚本:

^{pr2}$

一定要记住将Shell设置更改为/bin/sh。在

苹果发布了Python2.5和2.6和SnowLeopard(10.6),两个版本的部署目标都是10.6。如果你真的需要针对10.5版本的应用程序,你就不能安全地在10.6上使用苹果提供的Pythons来部署到10.5上。在

最简单的解决方案可能是下载并安装Python 2.6 from python.org。该Python的目标是10.3+,因此它可以同时用于10.5和10.6。您可能还需要确保Python安装在将部署应用程序的所有计算机上。在

另一个选择可能是使用py2app和python.org网站2.6并将其与主应用程序一起部署。或者在py2app下创建整个应用程序。在这两种情况下,应用程序都会包含自己的python框架解释器和框架,独立于系统版本。在

编辑:根据你的评论,我不确定我是否理解你的问题。由于您运行的是10.6,所以我不清楚(1)为什么将部署目标设置为10.5;(2)如果需要将部署设置为10.5。我猜你有一个现有的Xcode项目,它是在10.5上开发的,然后从10.5版的Xcode导入或升级到10.6版的Xcode。如果是这样的话,那么我认为唯一需要做的事情就是在项目窗口的顶部将activesdk从10.5更改为10.6(在概述中)。这样做并强制清除所有目标应该可以解决crt library not found错误;如果不是,则项目依赖项有问题。在

另一方面,如果你真的需要为10.5开发10.6,那么看起来gitversion.py引入了对Python2.6的不经意的依赖(从回溯可以看出),这不是10.5的一部分。除非您真的需要Python2.6特性,否则您应该能够通过使用Python2.5来消除这些特性,而Python2.5是苹果在10.5和10.6上提供的。在这种情况下,您可能只需要确保在构建阶段脚本中使用/usr/bin/python2.5调用python,而不仅仅是python。在

相关问题 更多 >