Con đường rất xa
Trường hợp sử dụng của tôi là:
- Tôi đang đồng bộ hóa phiên bản và xây dựng số trên một số mục tiêu.
- Tôi đang đồng bộ hóa phiên bản và xây dựng số với mục tiêu
Settigns.bundle
- Tôi đang đọc và sửa đổi số bản dựng từ máy chủ CI.
Tôi đã từng thực hiện điểm 1 và 2 dưới dạng tập lệnh xây dựng mục tiêu và điểm 3 dưới dạng tập lệnh tùy chỉnh trên chính CI.
Cách lưu trữ phiên bản và bản dựng mới trong cài đặt bản dựng Xcode đã gây ra sự cố với tập lệnh, vì chúng không còn có thể sửa đổi hiệu quả các giá trị. Ít nhất là đọc là có thể.
Thật không may, tôi không thể khám phá ra một cách hợp pháp để ngăn Xcode lưu trữ phiên bản và xây dựng số vào cài đặt xây dựng dự án, tuy nhiên tôi đã quản lý để tạo một cách giải quyết.
Nó chỉ ra rằng khi xây dựng hoặc lưu trữ được thực hiện, giá trị được ghi trong đó Info.plist
được sử dụng. Điều này có nghĩa là giá trị được thay thế trong thời gian xây dựng, điều này không cho phép chúng tôi sửa đổi nó trong cùng thời gian xây dựng.
Tôi cũng đã cố gắng sửa đổi dự án bằng xcodeproj
cli, tuy nhiên mọi thay đổi đối với dự án đều khiến bất kỳ bản dựng nào bị dừng, vì vậy giải pháp này không hoạt động.
Cuối cùng, sau rất nhiều cách tiếp cận khác nhau mà tôi đã thử, cuối cùng tôi cũng đã tìm được một sự thỏa hiệp không vi phạm hành vi mới của Xcode.
Câu trả lời ngắn:
Là một hành động trước mục tiêu, một tập lệnh được thực thi để ghi các giá trị tương ứng đến CFBundleShortVersionString
và CFBundleVersion
cho mục tiêuInfo.plist
Là một nguồn sự thật, tôi sử dụng cài đặt xây dựng Xcode để đọc các giá trị của MARKETING_VERSION
và CURRENT_PROJECT_VERSION
của mục tiêu mong muốn.
Bằng cách này, khi bạn sửa đổi các giá trị từ cài đặt dự án - khi xây dựng / lưu trữ tiếp theo - chúng sẽ được ghi vào Info.plist
, cho phép bất kỳ nếu logic kịch bản hiện tại của bạn tiếp tục hoạt động.
Trả lời chi tiết
Cách duy nhất để sửa đổi tài nguyên theo hành động xây dựng là sử dụng pre-action
tập lệnh. Nếu bạn thử thực hiện nó từ tập lệnh xây dựng - các thay đổi sẽ không có hiệu lực ngay lập tức và sẽ không có mặt ở cuối quá trình xây dựng / lưu trữ.
Để thêm một hành động xây dựng trước - đi đến chỉnh sửa sơ đồ.
Sau đó mở rộng phần Xây dựng và Lưu trữ. Bên dưới Pre-action
, nhấp vào Provide build and settings from
menu thả xuống và chọn nguồn đích đích mà bạn muốn đọc các giá trị.
Thêm đoạn mã sau:
# 1)
cd ${PROJECT_DIR}
# 2)
exec > Pruvit-Int.prebuild.sync_project_version_and_build_with_info_plists.log 2>&1
# 3)
./sync_project_version_and_build_with_info_plists.sh $MARKETING_VERSION $CURRENT_PROJECT_VERSION
Các dòng scrip làm như sau:
- Chuyển đến thư mục chứa tập lệnh đồng bộ hóa để thực thi nó
- Cho phép ghi nhật ký trong quá trình trước hành động, nếu không, mọi đầu ra đều bị tắt theo mặc định
- Thực thi tập lệnh đồng bộ hóa bằng cách cung cấp
MARKETING_VERSION
vàCURRENT_PROJECT_VERSION
Bước cuối cùng là viết tập lệnh đồng bộ của riêng bạn để đọc các giá trị được cung cấp MARKETING_VERSION
và CURRENT_PROJECT_VERSION
cho các mục tiêu / s tương ứng và bất cứ khi nào bạn muốn.
Trong trường hợp của tôi, kịch bản như sau:
#!/bin/bash
#IMPORTANT - this script must run as pre-action of each target's Build and Archive actions
version_number=$1
build_number=$2
echo "version_number is $version_number"
echo "build_number is $build_number"
#update Pruvit/Info.plist
pruvitInfoPlist="Pruvit/Info.plist"
/usr/libexec/PlistBuddy -c "Set CFBundleShortVersionString $version_number" $pruvitInfoPlist
/usr/libexec/PlistBuddy -c "Set CFBundleVersion $build_number" $pruvitInfoPlist
#update Pruvit/Settings.bundle
settingsPlist="Pruvit/Settings.bundle/Root.plist"
/usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:0:DefaultValue $version_number" $settingsPlist
/usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:1:DefaultValue $build_number" $settingsPlist
#update BadgeCounter/Info.plist
badgeCounterInfoPlist="BadgeCounter/Info.plist"
/usr/libexec/PlistBuddy -c "Set CFBundleShortVersionString $version_number" $badgeCounterInfoPlist
/usr/libexec/PlistBuddy -c "Set CFBundleVersion $build_number" $badgeCounterInfoPlist
Tôi sử dụng chia sẻ Info.plist
và Settings.bundle
giữa cả hai mục tiêu ứng dụng của mình, vì vậy tôi phải cập nhật điều này một lần.
Ngoài ra tôi sử dụng một tiện ích mở rộng dịch vụ thông báo BadgeCounter
, phải có cùng một phiên bản và xây dựng làm mục tiêu mà nó được nhúng vào. Vì vậy, tôi cập nhật điều này là tốt.