2009-11-09 32 views
5

Tôi đang cố gắng thêm một tập lệnh Python vào dự án của mình để lấy số xây dựng và tiếp thị trực tiếp từ Git.Xcode Target Phase Python Script

Tôi đã tạo ra một giai đoạn mục tiêu mới và chạy một kịch bản như đã giải thích ở:
http://yeahrightkeller.com/2008/10/19/xcode-run-script-build-phase-tip/

Và tôi đã viết một kịch bản Python rằng phân tích Info.plist chương trình sử dụng

from Foundation import NSMutableDictionary 

Tuy nhiên tập lệnh không thành công trong khi được biên dịch và báo cáo lỗi sau cho kết quả xây dựng:

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) 

Rõ ràng, distutils có cách nào đó mã hóa cứng mà nó được biên dịch cho phiên bản 10.6 (Snow Leopard, đó là cái tôi đang sử dụng), nhưng dự án có mục tiêu Triển khai MacOSX được đặt thành 10.5.

Nếu tôi cố gắng để thiết lập biến này trong dự án để 10,6, Sau đó tôi nhận được:

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

Bất kỳ ý tưởng về cách giải quyết vấn đề này? Cảm ơn trước.

Trả lời

1

Apple phân phối Python 2.5 và 2.6 với Snow Leopard (10.6) và cả hai đều được xây dựng với mục tiêu triển khai là 10.6. Nếu bạn thực sự cần nhắm mục tiêu ứng dụng của mình với 10.5, bạn không thể sử dụng Pythons do Apple cung cấp một cách an toàn trên 10.6 để triển khai trên 10.5.

Giải pháp dễ nhất có thể là tải xuống và cài đặt Python 2.6 from python.org. Python đó được nhắm mục tiêu cho 10.3+, vì vậy nó sẽ hoạt động trên cả 10.5 và 10.6. Bạn cũng có thể cần phải đảm bảo rằng Python được cài đặt trên tất cả các máy mà ứng dụng của bạn sẽ được triển khai.

Một tùy chọn khác có thể là tạo ứng dụng trợ giúp độc lập riêng biệt sử dụng py2app với python.org 2.6 và triển khai cùng với ứng dụng chính của bạn. Hoặc tạo toàn bộ ứng dụng của bạn dưới py2app. Trong cả hai trường hợp, ứng dụng sẽ chứa trình thông dịch và khung khuôn khổ python của riêng nó, độc lập với phiên bản hệ thống.

CHỈNH SỬA: Dựa trên nhận xét của bạn, tôi không chắc tôi có hiểu vấn đề của bạn hay không. Vì bạn đang chạy trên 10.6, nó không rõ ràng với tôi (1) lý do tại sao bạn có mục tiêu triển khai được đặt thành 10.5 và (2) nếu bạn cần phải triển khai được đặt thành 10.5. Tôi sẽ đoán rằng bạn đã có một dự án Xcode đã được phát triển trên 10.5 và sau đó được nhập hoặc nâng cấp từ Xcode trên 10.5 lên Xcode trên 10.6. Nếu đúng như vậy, thì tôi nghĩ điều duy nhất cần phải thực hiện là thay đổi SDK hoạt động từ 10.5 đến 10.6 (trong tổng quan) ở đầu cửa sổ dự án. Làm việc đó và buộc một Tất cả các mục tiêu sạch sẽ giải quyết lỗi crt library not found; nếu không, có điều gì đó sai trái với các phụ thuộc của dự án.

Mặt khác, nếu bạn thực sự cần phát triển trên 10.6 cho 10.5, thì có vẻ như gitversion.py của bạn đang giới thiệu một sự phụ thuộc vô ý vào python 2.6 (có thể được xem bởi traceback), không phải một phần của 10.5. Trừ khi bạn thực sự cần python 2,6 tính năng, bạn sẽ có thể loại bỏ điều đó bằng cách sử dụng python 2,5 mà Apple cung cấp trên cả 10.5 và 10.6. Trong trường hợp đó, có lẽ tất cả những gì bạn cần làm là đảm bảo rằng bạn gọi python trong kịch bản lệnh xây dựng với /usr/bin/python2.5 chứ không chỉ là python.

+0

Cảm ơn rất nhiều cho câu trả lời của bạn Ned. Triển khai cho 10.5 là phải đưa ra lỗi mà tôi nhận được với 10.6. Nhưng 10.5 không hoạt động vì các distutils mong đợi 10.6 (như được chỉ ra bởi biến môi trường.) Có cách nào để nói distutils làm việc cho 10.5 hoặc sử dụng phiên bản 10.5? Mục tiêu của tôi là chỉ thêm một tập lệnh python làm một pha đích vì đọc và viết plist dễ dàng hơn, không triển khai ứng dụng python. –

+0

Xem các nhận xét bổ sung ở trên. Hy vọng rằng sẽ giúp! –

+0

Cảm ơn một lần nữa Ned. Đây không phải là dự án MacOSX, mà là một iPhone và có vẻ như yêu cầu 10.5 là mục tiêu vì nếu không tôi sẽ nhận được: ld: không tìm thấy thư viện cho -lcrt1.10.6.o ngay cả sau khi làm sạch mục tiêu. Tôi đã quyết định đi một cách khó khăn và thay thế kịch bản python bằng một kịch bản perl mà thực hiện chính xác như nhau. Tôi không gặp lỗi tương tự với perl. Chúa ban phước cho Perl! Cảm ơn TMTOWTDI! Tôi vẫn tin rằng có một vấn đề với python khi được sử dụng như một kịch bản của một dự án iPhone, nhưng tôi có một giải pháp cho nó. –

1

Vì mục đích của tập lệnh này, bạn chỉ có thể tạm thời đặt giá trị của MACOSX_DEPLOYMENT_TARGET thành 10.6.Vì vậy, lệnh của bạn sẽ là:

env MACOSX_DEPLOYMENT_TARGET=10.6 gitversion.py 
2

Tôi có cùng một vấn đề, và tôi muốn giữ phiên bản python vì xử lý các plist qua NSMutableDictionary là đẹp hơn nhiều so với sử dụng regex trên Info.plist.

Xây dựng về câu trả lời Maxence của, giải pháp là dải mã python ra khỏi Run Script xây dựng giai đoạn thành một file 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) 

Sau đó, thay thế bản gốc Run Script với một kịch bản shell:

env MACOSX_DEPLOYMENT_TARGET=10.6 python gitversion.py 

Hãy nhớ thay đổi cài đặt Shell thành /bin/sh.

+0

[PlistBuddy] (https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man8/PlistBuddy.8.html) có thể được sử dụng để đọc/ghi Info.plist, fyi. – pkamb

Các vấn đề liên quan