Xcode目标阶段Python脚本

5 投票
4 回答
3266 浏览
提问于 2025-04-15 15:48

我正在尝试在我的项目中添加一个Python脚本,以便直接从Git获取构建和营销数字。

我创建了一个新的构建阶段,并按照以下链接中的说明运行了一个脚本:
http://yeahrightkeller.com/2008/10/19/xcode-run-script-build-phase-tip/

我写了一个Python脚本,用来解析程序的Info.plist文件,使用了

from Foundation import NSMutableDictionary

但是在编译这个脚本时,它失败了,并在构建结果中报告了以下错误:

Running a custom build phase script: gitversion.py  
Traceback (most recent call last):  
File "/Users/jorge/Documents/Programming iPod/Pruebas/RowOrder/Scripts/gitversion.py", line 9, in <module>  
from Foundation import NSMutableDictionary  
File "/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/Foundation/__init__.py", line 8, in <module>  
File "/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/PyObjC/objc/__init__.py", line 26, in <module>  
from _bridgesupport import *  
File "/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/PyObjC/objc/_bridgesupport.py", line 9, in <module>  
import pkg_resources  
File "/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/pkg_resources.py", line 651, in <module>  
class Environment(object):  
File "/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/pkg_resources.py", line 654, in Environment  
def __init__(self, search_path=None, platform=get_supported_platform(), python=PY_MAJOR):  
File "/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/pkg_resources.py", line 55, in get_supported_platform  
plat = get_build_platform(); m = macosVersionString.match(plat)  
File "/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/pkg_resources.py", line 181, in get_build_platform  
plat = get_platform()  
File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/distutils/util.py", line 97, in get_platform  
cfgvars = get_config_vars()  
File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/distutils/sysconfig.py", line 525, in get_config_vars  
func()  
File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/distutils/sysconfig.py", line 408, in _init_posix  
raise DistutilsPlatformError(my_msg)  
distutils.errors.DistutilsPlatformError: $MACOSX_DEPLOYMENT_TARGET mismatch: now "10.5" but "10.6" during configure  
Finished running custom build phase script: gitversion.py (exit status = 1)

很明显,distutils在某种情况下硬编码了它是为10.6版本(也就是我正在使用的Snow Leopard)编译的,但项目的MacOSX部署目标设置为10.5。

如果我尝试将这个变量在项目中设置为10.6,我就会得到:

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

有没有什么办法可以解决这个问题?提前谢谢!

4 个回答

1

为了这个脚本的需要,你可以暂时把 MACOSX_DEPLOYMENT_TARGET 的值设置为 10.6。所以你的命令应该是:

env MACOSX_DEPLOYMENT_TARGET=10.6 gitversion.py
1

苹果在它的Snow Leopard(10.6)系统中提供了Python 2.5和2.6这两个版本,这些版本都是为10.6系统准备的。如果你真的需要让你的应用程序在10.5系统上运行,那么在10.6上使用苹果提供的Python来部署到10.5上是有风险的。

最简单的解决办法是去python.org下载并安装Python 2.6。这个版本是为10.3及以上的系统设计的,所以它在10.5和10.6上都能正常工作。你可能还需要确保在所有要部署你应用的机器上都安装了这个Python。

另一个选择是使用py2app和python.org的2.6版本创建一个独立的辅助应用,并和你的主应用一起部署。或者你可以在py2app下创建整个应用。无论哪种方式,应用都会包含自己的Python解释器和框架,这样就不依赖于系统的版本了。

编辑:根据你的评论,我不太明白你的问题。因为你是在10.6上运行的,所以我不清楚(1)为什么你的部署目标设置为10.5,以及(2)你是否真的需要将部署设置为10.5。我猜测你可能有一个在10.5上开发的现有Xcode项目,然后从10.5的Xcode导入或升级到10.6的Xcode。如果是这样的话,我认为你只需要在项目窗口顶部的概览中将活动SDK从10.5改为10.6。这样做并强制执行“清理所有目标”应该能解决crt library not found的错误;如果不行,那可能是项目依赖出了问题。

另一方面,如果你确实需要在10.6上开发以支持10.5,那么看起来你的gitversion.py引入了一个意外的对Python 2.6的依赖(从错误追踪中可以看出),而这个版本并不包含在10.5中。除非你真的需要Python 2.6的功能,否则你可以使用苹果在10.5和10.6上提供的Python 2.5来解决这个问题。在这种情况下,也许你只需要确保在构建阶段的脚本中调用Python时使用/usr/bin/python2.5,而不是直接使用python。

2

我也遇到了同样的问题,我想继续使用Python,因为用NSMutableDictionary处理plist文件比用正则表达式处理Info.plist要简单得多。

在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脚本:

env MACOSX_DEPLOYMENT_TARGET=10.6 python gitversion.py

记得把Shell的设置改成/bin/sh哦。

撰写回答