2013-01-10 35 views
5

Tôi đang sử dụng git-svn và tôi đang cố gắng nhúng số bản sửa đổi của mình vào ứng dụng iOS. Tại thời điểm này, tôi có một giai đoạn xây dựng chạy kịch bản sau đây:Tôi làm cách nào để đặt số xây dựng của ứng dụng mà không làm bẩn cây nguồn của mình?

SVN_REVISION=$(git svn find-rev HEAD) 
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $SVN_REVISION" "$INFOPLIST_FILE" 

Vấn đề ở đây là, kể từ khi repo luôn chứa trước sửa đổi, kịch bản luôn luôn làm Info.plist của tôi bẩn.

Tôi có thể tự động đặt số bản dựng của ứng dụng mà không làm bẩn cây nguồn của mình không?

Trả lời

8

1) Thêm mục tiêu mới vào dự án thuộc loại "Tổng hợp" của bạn, ví dụ: bạn có thể đặt tên cho nó là "Update Info.plist Prefix Header"; chỉ cần sử dụng đó là "Tên sản phẩm" trong hộp thoại.

2) Thêm một Run Script xây dựng giai đoạn với mục tiêu mới này với mã nguồn sau đây:

#!/bin/sh 
SVN_REVISION=$(git svn find-rev HEAD) 
echo "#define SVN_REVISION $SVN_REVISION" > "$SCRIPT_OUTPUT_FILE_0" 


3) Thêm một tập tin đầu ra để kịch bản của bạn, tên nó

$(CONFIGURATION_TEMP_DIR)/InfoPlist.pch 


4) Mở giai đoạn xây dựng của ứng dụng iOS của bạn.

5) Thêm mục tiêu tổng hợp bạn đã tạo trước đó làm mục tiêu phụ thuộc (thêm nó vào "Phụ thuộc mục tiêu"). Điều này có nghĩa là Xcode sẽ luôn xây dựng mục tiêu này trước khi nó sẽ xây dựng mục tiêu iOS của bạn.

6) Mở Cài đặt bản dựng của ứng dụng iOS của bạn.

7) Tìm kiếm cài đặt "Info.plist Prefixor Prefix File" và thay đổi chính xác cùng giá trị bạn đã sử dụng cho tệp đầu ra ở bước (3).

8) Tìm kiếm cài đặt "Preprocess Info.plist File" và đảm bảo rằng nó được bật.

9) Mở tệp Info.plist hiện tại của bạn và thay đổi giá trị của CFBundleVersion thành SVN_REVISION. Không sử dụng $ (SVN_REVISION) hoặc $ {SVN_REVISION}; đây không phải là thiết lập xây dựng hoặc thay thế biến môi trường, đây là một sự thay thế tiền xử lý, vì vậy chỉ cần sử dụng SVN_REVISION.


Vậy đó. Mỗi lần bạn xây dựng ứng dụng iOS, Xcode đầu tiên xây dựng mục tiêu tổng hợp, cập nhật tệp PCH và khi nó xây dựng ứng dụng iOS của bạn, nó sẽ chạy tệp Info.plist thông qua bộ xử lý trước C (sử dụng tệp PCH làm tiền tố tiêu đề) trước khi sao chép nó vào ứng dụng của bạn. Bộ xử lý trước sẽ thay thế SVN_REVISION vì nó được định nghĩa là macro trong tệp PCH của bạn.

Lưu ý quan trọng

Một số người có thể nghĩ rằng đó là một ý tưởng tốt hơn để sử dụng $(DERIVED_FILE_DIR) thay vì $(CONFIGURATION_TEMP_DIR). Vâng, về lý thuyết chúng là đúng, nhưng chỉ có một vấn đề trong thực tế: dir thư mục dẫn xuất là khác nhau cho mỗi mục tiêu, trong khi thư mục tạm thời cấu hình là như nhau (nó chỉ khác nhau cho mỗi cấu hình xây dựng). Khi sử dụng thư mục tệp dẫn xuất, tệp PCH được ghi vào thư mục tệp dẫn xuất của mục tiêu tổng hợp, nhưng khi xây dựng ứng dụng iOS, Xcode sẽ tìm kiếm tệp này trong thư mục tệp dẫn xuất của ứng dụng iOS và do đó sẽ không tìm thấy tập tin.

Một số người cũng có thể nghĩ rằng chỉ cần thêm giai đoạn chạy tập lệnh để cập nhật tiêu đề tiền tố là giai đoạn xây dựng đầu tiên của ứng dụng iOS thay vì tạo mục tiêu riêng cho nó. vấn đề tập tin dir đã đề cập ở trên). Một lần nữa, ý tưởng hay về lý thuyết nhưng không thể làm việc trong thực tế: Nếu được xử lý trước, Info.plist được xử lý trước khi giai đoạn tập lệnh đầu tiên được thực thi, vì vậy nếu tệp PCH không tồn tại hoặc chưa được cập nhật, hoặc xây dựng chấm dứt với một lỗi hoặc một sửa đổi SVN lỗi thời được ghi vào tập tin plist. Đó là lý do tại sao bạn cần một mục tiêu riêng cho nhiệm vụ này được đảm bảo sẽ được xây dựng trước mục tiêu thực sự của bạn.

2

Mecki cảm ơn vì câu trả lời tuyệt vời! Tôi đã áp dụng cùng một khái niệm để đặt dấu thời gian phiên bản và git SHA hiện tại cho bản dựng. FYI Tôi chỉ gặp phải một vấn đề nhỏ. Dường như, ít nhất là trong Xcode 5, nếu bạn chỉ định tệp đầu ra, bước kịch bản sử dụng nó làm bộ nhớ cache, vì vậy bất kể thay đổi nào tôi đã thực hiện cho mã ứng dụng thực tế của mình, tập lệnh đã báo cáo rằng nó đã chạy nhưng các giá trị không phải là những người hiện tại ... tôi đã phải di chuyển tờ khai tập tin đầu ra kịch bản riêng của mình để giải quyết vấn đề này, tức là thêm

SCRIPT_OUTPUT_FILE_0="$CONFIGURATION_TEMP_DIR/InfoPlist.pch" 

để phía trên cùng của kịch bản của tôi. Ngoài ra các plist gốc cũng nên được xúc động để cho xây dựng các bước để sao chép các giá trị mới trong, vì vậy tôi cũng nói thêm

`touch $SCRIPT_INPUT_FILE_0` 

sau khi tuyên bố tập tin đầu ra trước. Thao tác chạm này không làm cho git phát hiện thay đổi là có thể thực hiện được.

Chúc mừng

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