Cách tốt hơn để tăng số lượng xây dựng?


133

Tôi đã sử dụng tập lệnh shell như một phần của quy trình xây dựng Xcode của mình để tăng số bản dựng trong tệp plist , tuy nhiên, điều đó khiến Xcode 4.2.1 bị sập thường xuyên (với lỗi về mục tiêu không thuộc về dự án; tôi đoán những thay đổi của plist tệp gây nhầm lẫn Xcode theo một cách nào đó).

Tập lệnh shell đã làm điều này để số bản dựng chỉ được tăng lên agvtoolkhi tệp mới hơn tệp plist (vì vậy chỉ xây dựng không tăng giá trị):

if [ -n \"`find ProjDir -newer ProjDir/Project-Info.plist`\" ]; then agvtool -noscm next-version -all; else echo \"Version not incremented\"; fi

Có cách nào để tăng số bản dựng (trong tệp plist hoặc bất kỳ nơi nào khác) không phá vỡ Xcode không?

EDIT FINAL : Bây giờ tôi thực hiện loại công cụ này bằng cách sử dụng tập lệnh python mà tôi vừa công khai trên github . Nó không được ghi chép tốt nhưng không khó để làm việc. Như một phần thưởng, repo này cũng chứa một tập lệnh hữu ích để tự động gói thư viện của bên thứ 3 vào một gói ứng dụng.


1
Nếu có ai quan tâm: Tôi đã sửa đổi tập lệnh một chút để sử dụng số thập lục phân thay vì số thập phân - gist.github.com/sascha/5398750
Sascha

1
Bạn có thể thêm tập lệnh này dưới dạng hành động dựng trước trực tiếp, không cần phải gọi tập lệnh bên ngoài. Không chạy tập lệnh này với giai đoạn xây dựng; Xcode sẽ chỉ sao chép bản cập nhật mỗi bản dựng khác.
Ed McManus

3
Ngoài hộp tôi đã gặp lỗi "bị từ chối cấp phép" vì vậy tôi nghĩ rằng tôi đã chỉ ra câu hỏi và trả lời này cho bất kỳ ai khác có cùng trải nghiệm: stackoverflow.com/q/9850936/519030
Jason

Kịch bản này không thành công với mã thoát 1. Có ai có thể giúp tôi không?
Robert J. Clegg

@Tander Có vẻ như bạn không cung cấp tệp plist làm đối số cho tập lệnh.
trojanfoe

Câu trả lời:


29

Nếu tôi hiểu chính xác câu hỏi của bạn, bạn muốn sửa đổi Project-Info.plist tệp, đây là một phần của mẫu dự án tiêu chuẩn của Xcode?

Lý do tôi hỏi điều này là Project-Info.plist thông thường nằm dưới sự kiểm soát phiên bản và sửa đổi nó có nghĩa là nó sẽ được đánh dấu là, tốt, được sửa đổi.

Nếu điều đó tốt với bạn, thì đoạn mã sau sẽ cập nhật số bản dựng và đánh dấu tệp là đã sửa đổi trong quy trình, trong đó get_build_numbercó một số tập lệnh (ví dụ: giữ chỗ trong ví dụ này) để lấy số bản dựng (có thể tăng) mà bạn muốn sử dụng:

#!/bin/sh

# get_build_number is a placeholder for your script to get the latest build number
build_number = `get_build_number`

/usr/libexec/PlistBuddy -c "Set :CFBundleVersion ${build_number}" ProjDir/Project-Info.plist

PlistBuddy cho phép bạn đặt bất kỳ khóa nào trong tệp plist, không chỉ số phiên bản. Bạn có thể tạo tất cả các tệp plist bạn muốn và đưa chúng vào tài nguyên nếu cần. Sau đó chúng có thể được đọc từ gói.

Khi bạn cần hiển thị phiên bản trong khung giới thiệu và các địa điểm khác, bạn cũng có thể xem xét cài đặt CFBundleGetInfoStringCFBundleShortVersionString.


Tôi không cần git commit (hoặc thẻ) trong tệp plist để hệ thống tăng đơn giản vẫn ổn (như được cung cấp bởi agvtool), tuy nhiên hành động sửa đổi plist trong quá trình xây dựng sẽ phá vỡ Xcode thường xuyên (vì loại bỏ tập lệnh mà nó không ' T đã bị sập một lần, khi nó bị sập cứ sau 3 lần xây dựng hoặc hơn). Có thể đặt thông tin phiên bản trong một tệp plist khác và có kèm theo gói và có thể truy cập được từ Ứng dụng không?
trojanfoe

Kịch bản tuyệt vời - Tôi muốn kết hợp điều này với đề xuất của Hugues BR để chỉ sử dụng nó khi lưu trữ các bản dựng. Giữ số lượng thấp và bỏ qua tuy nhiên nhiều bản dựng dev được thực hiện giữa các bản phát hành.
Jay

5
Get_build_number là gì? Có phải đó chỉ là một số giữ chỗ?
chrisp

Có, get_build_numberchỉ là một giữ chỗ - cập nhật câu trả lời để làm rõ.
Monolo

72

Tôi đã loay hoay với rất nhiều câu trả lời cho câu hỏi này, và không ai trong số họ làm tôi hài lòng. Tuy nhiên, cuối cùng tôi đã đưa ra một hỗn hợp mà tôi thực sự thích!

Có hai bước, một ở đầu và một ở cuối giai đoạn xây dựng của bạn.

Lúc bắt đầu:

# Set the build number to the count of Git commits
if [ "${CONFIGURATION}" = "Release" ]; then
    buildNumber=$(git rev-list HEAD | wc -l | tr -d ' ')
    /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${PROJECT_DIR}/${INFOPLIST_FILE}"
fi

Cuối cùng:

# Set the build number to "DEVELOPMENT"
if [ "${CONFIGURATION}" = "Release" ]; then
    /usr/libexec/PlistBuddy -c "Set :CFBundleVersion DEVELOPMENT" "${PROJECT_DIR}/${INFOPLIST_FILE}"
fi

Nhìn vào Info.plist trong Xcode, bạn sẽ thấy số phiên bản là "PHÁT TRIỂN", nhưng ứng dụng được xây dựng sẽ có số lượng bản dựng tăng liên tục. (Miễn là bạn luôn thực hiện các bản dựng của mình cùng một nhánh.)

Đặt số phiên bản trở lại một chuỗi không đổi ở cuối sẽ ngăn không cho tệp Info.plist bị thay đổi bằng cách xây dựng ứng dụng.

Tại sao tôi thích phương pháp này:

  • Dễ dàng
  • Không gây ô nhiễm lịch sử phiên bản Git
  • CFBundleVersion hoàn toàn tự động
  • Số phiên bản đẹp có thể được sửa đổi bất cứ khi nào tôi muốn

Giữ số phiên bản trong tệp plist kiểm soát phiên bản là cách tốt nhất để làm điều đó, đặc biệt nếu bạn có một bản phát hành mỗi lần phát hành và đôi khi cần phải hợp nhất hoặc chọn cherry. Cảm ơn!
Matthew Phillips

14
Bạn có thể sử dụng git rev-list --count HEADthay vì git rev-list HEAD | wc -l | tr -d ' '.
kennytm

Hừm. Tôi thấy rằng nếu bạn sử dụng fastlaneđể tải lên các bản dựng tự động theo cách này, bạn sẽ nhận được: ERROR ITMS-90058: "Gói này không hợp lệ. Giá trị cho khóa CFBundleVersion [PHÁT TRIỂN] trong tệp Info.plist phải là một danh sách được phân tách theo thời gian tại hầu hết ba số nguyên không âm. "
fatuhoku

1
Tôi không chắc chắn chính xác nơi nó sẽ đi, tôi đặt kịch bản đầu tiên làm giai đoạn xây dựng đầu tiên và kịch bản cuối cùng là giai đoạn xây dựng cuối cùng và nó hoạt động với tôi.
Wil G Dieseler 8/8/2015

1
Bạn chắc chắn có thể cam kết Info.plist sử dụng giải pháp này - đó là toàn bộ vấn đề. Info.plist luôn được đặt và đăng ký với số phiên bản được đặt thành "PHÁT TRIỂN", nó tạm thời thay đổi trong quá trình xây dựng và sau đó được đặt lại thành "PHÁT TRIỂN" để Info.plist ổn định.
Wil G Dieseler

38

Tôi đã sử dụng ánh sáng này. Nó hoạt động như mong đợi. https://gist.github.com/sekati/3172554 (tất cả tín dụng thuộc về tác giả gốc)

Các kịch bản mà tôi đã sửa đổi theo thời gian.

xcode-versionString-generator.sh ,

xcode-build-number-generator.sh

Vì những ý chính này đang giúp đỡ cộng đồng dev, tôi đã thực hiện dự án GitHub từ đó. Vì vậy, hãy phát triển nó tốt. Đây là dự án GitHub: https://github.com/alokc83/Xcode-build-and-version-generator

Tôi đã cập nhật mã cho cả hai tập lệnh nâng cao. thay vì sử dụng dưới đây, hãy lấy bản mới nhất từ ​​GitHub

Đối với phiên bản:

# xcode-version-bump.sh
# @desc Auto-increment the version number (only) when a project is archived for export. 
# @usage
# 1. Select: your Target in Xcode
# 2. Select: Build Phases Tab
# 3. Select: Add Build Phase -> Add Run Script
# 4. Paste code below in to new "Run Script" section
# 5. Check the checkbox "Run script only when installing"
# 6. Drag the "Run Script" below "Link Binaries With Libraries"
# 7. Insure your starting version number is in SemVer format (e.g. 1.0.0)

# This splits a two-decimal version string, such as "0.45.123", allowing us to increment the third position.
VERSIONNUM=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "${PROJECT_DIR}/${INFOPLIST_FILE}")
NEWSUBVERSION=`echo $VERSIONNUM | awk -F "." '{print $3}'`
NEWSUBVERSION=$(($NEWSUBVERSION + 1))
NEWVERSIONSTRING=`echo $VERSIONNUM | awk -F "." '{print $1 "." $2 ".'$NEWSUBVERSION'" }'`
/usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString $NEWVERSIONSTRING" "${PROJECT_DIR}/${INFOPLIST_FILE}"

Để xây dựng:

# xcode-build-bump.sh
# @desc Auto-increment the build number every time the project is run. 
# @usage
# 1. Select: your Target in Xcode
# 2. Select: Build Phases Tab
# 3. Select: Add Build Phase -> Add Run Script
# 4. Paste code below into new "Run Script" section
# 5. Drag the "Run Script" below "Link Binaries With Libraries"
# 6. Ensure that your starting build number is set to a whole integer and not a float (e.g. 1, not 1.0)

buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${PROJECT_DIR}/${INFOPLIST_FILE}")
buildNumber=$(($buildNumber + 1))
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${PROJECT_DIR}/${INFOPLIST_FILE}"

Điều này sẽ luôn tăng số bản dựng, trong đó như tôi muốn nó chỉ tăng nếu một tệp nguồn thay đổi. Đó chỉ là kịch bản tôi hiện đang sử dụng với ít kiểm tra an toàn hơn và ít sáng suốt hơn về những gì đã thay đổi.
trojanfoe

XCode 5: Trình chỉnh sửa (thanh menu) → Thêm giai đoạn xây dựng → Thêm Sao chép tập tin Xây dựng giai đoạn:
Jonny

@trojanfoe: Bạn có thể chạy tập lệnh này dưới dạng hook hook. Kịch bản này sẽ chỉ tăng số bản dựng khi bạn cam kết mã của mình để repo. Trả lời dưới đây từ LostInTheTrees là một cái gì đó nhiều hơn mà bạn có thể muốn làm.
Alix

Các tập lệnh shell được liên kết bởi @Alix bây giờ khá khác với các tập lệnh được đăng ở đây. Để tăng số bản dựng chỉ khi thực hiện bản dựng lưu trữ, bạn có thể sử dụng ý chính tôi đã thực hiện, dựa rất nhiều vào các tập lệnh của Alix ở trên, tại đây: gist.github.com/mattpotts/abcffea6d08ad45739ef
Matthew

14

Toàn bộ mục này là vô cùng hữu ích. Tôi đã sử dụng thủ thuật này nhưng thiết lập tập lệnh của mình dưới dạng hook sau cam kết trong GIT, do đó CFBundleVersion được tăng lên sau mỗi lần xác nhận thành công. Kịch bản hook đi vào .git / hook. Một bản ghi được để lại trong thư mục dự án.

Điều này đáp ứng tiêu chí cơ bản nhất của tôi. Tôi muốn có thể lấy một phiên bản từ GIT và xây dựng lại bản dựng chính xác mà tôi đã có trước đây. Bất kỳ gia tăng nào được thực hiện trong quá trình xây dựng không làm điều này.

Đây là kịch bản của tôi:

#!/bin/sh
#
# post-commit
#
# This script increments the CFBundleVersion for each successful commit
#

plist="./XYZZY/XYZZY-Info.plist"
buildnum=$(/usr/libexec/Plistbuddy -c "Print CFBundleVersion" "$plist")
if [ -z "$buildnum" ]; then
    exit 1
fi
buildnumplus=$(expr $buildnum + 1)
/usr/libexec/Plistbuddy -c "Set CFBundleVersion $buildnumplus" "$plist"

echo $(date) "- Incremented CFBundleVersion to" $buildnumplus >> hookLog.txt

Tôi có cùng một yêu cầu, đó là lý do tại sao số bản dựng chỉ được tăng lên nếu một tệp nguồn đã được sửa đổi. Tôi đã thấy điều này hoạt động rất tốt và không phải thay đổi bump_build_number.shkịch bản kể từ khi tạo.
trojanfoe

14

Tôi không biết cách nào là tốt nhất, nhưng tôi sẽ đăng câu trả lời của Apple trong trường hợp có ai đang tìm kiếm nó ...

Theo bài đăng Q & A của Apple này :

Tự động hóa phiên bản và xây dựng số bằng agvtool

Phiên bản và khóa số xây dựng tương ứng chỉ định phiên bản tiếp thị và nội bộ của ứng dụng của bạn. agvtool là một công cụ dòng lệnh cho phép bạn tự động tăng các số này lên số cao nhất tiếp theo hoặc đến một số cụ thể.

Số bản dựng xác định phiên bản chưa phát hành hoặc phát hành của ứng dụng của bạn. Nó được lưu trữ trong Info.plist của ứng dụng của bạn dưới dạng CFBundleVersion(phiên bản Bundle).

Bạn phải hoàn thành các bước sau trong dự án Xcode của mình:

  1. Kích hoạt agvtool

Điều hướng đến ngăn Cài đặt bản dựng của mục tiêu của bạn, sau đó cập nhật nó cho tất cả các cấu hình bản dựng của bạn như sau:

  • Đặt Phiên bản dự án hiện tại thành giá trị bạn chọn.

Tệp dữ liệu dự án Xcode của bạn, project.pbxproj, bao gồm CURRENT_PROJECT_VERSIONcài đặt bản dựng (Phiên bản dự án hiện tại), chỉ định phiên bản hiện tại của dự án của bạn. agvtool tìm kiếm project.pbxproj cho CURRENT_PROJECT_VERSION. Nó tiếp tục chạy nếu CURRENT_PROJECT_VERSIONtồn tại và ngừng chạy, nếu không. Giá trị của nó được sử dụng để cập nhật số bản dựng.

  • Đặt hệ thống phiên bản thành Apple Generic.

Theo mặc định, Xcode không sử dụng bất kỳ hệ thống phiên bản nào. Đặt Hệ thống Phiên bản thành Apple Generic đảm bảo rằng Xcode sẽ bao gồm tất cả thông tin phiên bản do agvtool tạo trong dự án của bạn.

Đặt hệ thống phiên bản thành Apple Generic

  1. Thiết lập phiên bản của bạn và xây dựng số

agvtool tìm kiếm Info.plist cho ứng dụng của bạn cho phiên bản và số bản dựng. Nó cập nhật chúng nếu chúng tồn tại và không làm gì khác. Đảm bảo rằng các khóa CFBundleVersion(Phiên bản gói) và CFBundleShortVersionString(Chuỗi phiên bản gói, ngắn) tồn tại trong Info.plist của bạn như được thấy trong hình ảnh bên dưới:

Thiết lập phiên bản của bạn và xây dựng số

Thoát Xcode, sau đó điều hướng đến thư mục chứa tệp dự án .xcodeproj của bạn trong ứng dụng Terminal trước khi chạy bất kỳ lệnh nào sau đây. Tệp dự án .xcodeproj chứa project.pbxproj, được agvtool sử dụng. (Đây là phần bạn có thể chạy trong tập lệnh thay vì dòng lệnh.)

Cập nhật số phiên bản

Để cập nhật số phiên bản thành phiên bản cụ thể, hãy chạy

xcrun agvtool new-marketing-version <your_specific_version>

Ví dụ: Cập nhật số phiên bản lên 2.0

xcrun agvtool new-marketing-version 2.0

Cập nhật số bản dựng

Để tự động tăng số bản dựng của bạn, hãy chạy

xcrun agvtool next-version -all

Để đặt số bản dựng của ứng dụng của bạn thành một phiên bản cụ thể, hãy chạy

xcrun agvtool new-version -all <your_specific_version>

Ví dụ: Đặt số bản dựng thành 2.6.9

xcrun agvtool new-version -all 2.6.9

Tặng kem:

Để xem số phiên bản hiện tại, hãy chạy

xcrun agvtool what-marketing-version

Để xem số bản dựng hiện tại, hãy chạy

xcrun agvtool what-version

7
Vấn đề với điều này là agvtool sẽ hủy bỏ việc xây dựng xcode để nó không thể được tích hợp như một tập lệnh trong các giai đoạn xây dựng.
Daniel Schlaug

1
Bạn không thể đặt vết sưng thông qua agvtool trong các hành động xây dựng trước của chương trình?
lottadot

11

FWIW - đây là những gì tôi hiện đang sử dụng để tăng số lượng bản dựng chỉ cho các bản dựng phát hành (bao gồm lưu trữ). Hoạt động tốt theo Xcode 5.1.

Chỉ cần sao chép / dán đoạn mã vào giai đoạn xây dựng tập lệnh Run trực tiếp trong Xcode:

buildnum=$(/usr/libexec/PlistBuddy -c "Print :CFBundleVersion" "$PRODUCT_SETTINGS_PATH")

if [ "$CONFIGURATION" = "Release" ]; then
buildnum=$((buildnum + 1))
echo "Build number updated to $buildnum"
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildnum" "$PRODUCT_SETTINGS_PATH"
fi;

Làm thế nào bạn có thể tăng CFBundleVersion? Trong Xcode 5.1, đó là một chuỗi được định dạng như "1.0"?
chrisp

1
Cuối cùng cũng có người làm đúng :) Tại sao tôi lại quan tâm đến mọi bản dựng tôi chạy trên thiết bị dev của mình? Phát hành (và phát hành cho người kiểm tra), chứ không phải bản dựng "hmm, di chuyển 2px sang bên trái".
uvesten

7

Cảm ơn kịch bản. Nó hoạt động rất tốt.

Info.plist của tôi nằm trong thư mục con có tên chứa khoảng trắng nên tôi phải sửa đổi Run Script bằng dấu ngoặc kép quanh đường dẫn plist:

${PROJECT_DIR}/tools/bump_build_number.sh "${PROJECT_DIR}/${INFOPLIST_FILE}"

và tập lệnh shell theo cùng một cách với các trích dẫn xung quanh tất cả các đường dẫn:

#!/bin/sh

if [ $# -ne 1 ]; then
    echo usage: $0 plist-file
    exit 1
fi

plist=$1
dir=$(dirname "$plist")

# Only increment the build number if source files have changed
if [ -n "$(find "$dir" \! -path "*xcuserdata*" \! -path "*.git" -newer "$plist")" ]; then
    buildnum=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$plist")
    if [ -z "$buildnum" ]; then
        echo "No build number in $plist"
        exit 2
    fi
    buildnum=$(expr $buildnum + 1)
    /usr/libexec/Plistbuddy -c "Set CFBundleVersion $buildnum" "$plist"
    echo "Incremented build number to $buildnum"
else
    echo "Not incrementing build number as source files have not changed"
fi

Vâng, điều đó có ý nghĩa. Vui mừng bạn thấy nó hữu ích; Tôi đã sử dụng từ bao giờ mà không gặp vấn đề gì trong Xcode 4. {2,3,4,5}.
trojanfoe

Tôi sẽ tự cứu mình vài giờ nếu tôi thấy câu trả lời này! Ngoài ra, lưu ý rằng số bản dựng hte không được có số thập phân hoặc BASH sẽ bị lệch.
Brenden

6

Kịch bản tôi hiện đang sử dụng rất nhiều dựa trên Alix , ở trên. Điều chỉnh của tôi, bên dưới, thêm một kiểm tra để chỉ thực hiện tăng tự động trên bản dựng phát hành / lưu trữ.

Nếu không có sự thay đổi đó, sẽ có xung đột kiểm soát phiên bản vì mỗi nhà phát triển sẽ tăng số bản dựng theo tỷ lệ của riêng họ. Và thực tế là lịch sử git sẽ bị ô nhiễm một cách không cần thiết với số lượng bản dựng thay đổi liên tục.

# xcode-build-bump.sh
# @desc Auto-increment Xcode target build number every time the project is archived
# @src stackoverflow.com/a/15483906
# @usage
# 1. Select: your Target in Xcode
# 2. Select: Build Phases Tab
# 3. Select: Add Build Phase -> Add Run Script
# 4. Paste code below in to new "Run Script" section
# 5. Drag the "Run Script" below "Link Binaries With Libraries"
# 6. Insure that your starting build number is set to a whole integer and not a float (e.g. 1, not 1.0)

if [ "Release" != "${CONFIGURATION}" ]
then
    exit 0
fi

buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${PROJECT_DIR}/${INFOPLIST_FILE}")
buildNumber=$(($buildNumber + 1))
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${PROJECT_DIR}/${INFOPLIST_FILE}"

Nó cũng có sẵn (ở dạng dễ sao chép và dán hơn một chút) dưới dạng ý chính của GitHub .


5

Tôi muốn giới thiệu việc sử dụng tự động sửa đổi .

Xcode cho phép một tệp tiêu đề (có thể được tạo tự động khi xây dựng và không phải trong bản thân vcs) để cung cấp các giá trị sẽ được mở rộng trong thông tin.plist tại thời điểm xây dựng. Bạn có thể tìm thấy một hướng dẫn để thiết lập điều này trên trang web tự động sửa đổi .

Tự động sửa đổi có một loại đầu ra hướng đến các tệp tiêu đề loại này để giúp chính xác trong các tình huống này.


1
Autorevisionkhông xuất hiện để tăng số lượng bản dựng, theo yêu cầu?
trojanfoe

Giả sử rằng người ta chỉ xây dựng trên một cam kết mới thì đó VCS_NUMsẽ là những gì bạn đang tìm kiếm ( xem autorevision.hví dụ ).
dak180

Vienna-Info.plistVienna-All.xcconfig là một ví dụ điển hình về cách người ta có thể thiết lập điều này trong bất kỳ dự án xcode nào.
dak180

4

Một vấn đề với một số giải pháp này là Launch Services chỉ nhận ra bốn năm chữ số chính trong phiên bản gói . Tôi có một dự án với số bản dựng lên đến hàng ngàn, vì vậy tôi muốn sử dụng một số chữ số ít quan trọng hơn.

Tập lệnh Perl này tăng tất cả Info.plists trong dự án, không chỉ là tập lệnh cho mục tiêu hiện tại, vì vậy tất cả các số bản dựng đều ở trong trạng thái khóa. Nó cũng sử dụng một chữ số vá và hai chữ số phụ, do đó, bản dựng 1234 được đưa ra phiên bản 1.23.4. Tôi sử dụng nó như một hành vi xây dựng trước, vì vậy nó áp dụng cho tất cả các dự án tôi xây dựng.

Kịch bản là khá mạnh mẽ, nhưng nó làm việc cho tôi.

#!/usr/bin/perl

use strict;
use warnings;
use v5.12.0;

use Dir::Iterate;

for my $plist_file(grepdir { /-Info.plist$/ } '.') {
    my $build = `/usr/libexec/PlistBuddy -c "Print CFBundleVersion" '$plist_file'`;
    chomp $build;

    next unless $build;

    # Strip dots
    $build =~ s/\.//g;
    $build =~ s/^0//g;

    # Increment
    $build++;

    # Re-insert dots
    $build =~ s/^(\d{0,4}?) (\d{0,2}?) (\d{0,1}?)$/$1.$2.$3/x;

    # Insert zeroes
    $build =~ s{(^|\.)\.}{${1}0.}g;

    system qq(/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $build" '$plist_file');
}

Bài đăng bạn trích dẫn nói rằng ' Hiệu quả, LS mong đợi định dạng sau: nnnnn [.nn [.nn]] [X] trong đó n là một chữ số 0-9, dấu ngoặc vuông cho biết các thành phần tùy chọn và X không phải là bất kỳ chuỗi nào bắt đầu bằng một chữ số X bị bỏ qua khi có mặt. '- vì vậy đó là 99999 bản dựng. Nên đủ cho hầu hết các dự án ..?
Jay

@Jay tôi rõ ràng đã đọc nhầm thành bốn chữ số. Giáo sư. (Tuy nhiên, nếu phong cách phát triển của bạn bao gồm nhiều điều chỉnh và xây dựng lại, không thể tưởng tượng rằng bạn có thể đạt tới 100.000 bản dựng sau nhiều năm phát triển trong một dự án.)
Brent Royal-Gordon

@ BrentRidel-Gordon Đúng - Tôi đã điều chỉnh tập lệnh xây dựng của mình thành các bản dựng tăng dần chỉ cho các cấu hình phát hành .. mặc dù tôi có thể chưa bao giờ đạt được bất kỳ nơi nào gần các bản dựng 10k ngay cả với sản phẩm kế thừa hơn 10 năm của tôi, nó cảm thấy rất tốt khi có vô số phòng đầu với các dự án ca cao mới ;-)
Jay

4

Bạn có thể sử dụng phiên bản chung của Apple . Về cơ bản, tất cả những gì bạn phải làm là gọi agvtool next-version -alltừ trong thư mục lưu trữ tệp .xcproj của bạn. Để biết thêm chi tiết kiểm tra các url ở trên.


3
Vấn đề với giải pháp này là việc gọi agvtool từ trong một tập lệnh trong dự án sẽ hủy bản dựng của bạn. Đó không phải là một giải pháp tốt trừ khi bạn có thể tìm ra cách giải quyết cho việc này.
Dan Loewenherz

3

Dựa trên giải pháp của Wil G Diesel , tôi chỉ có một thay đổi mà tôi muốn thực hiện. Giải pháp của anh ta đặt số lượng git cam kết vào số bản dựng. Hữu ích, nhưng vẫn là một nỗi đau để tìm ra cam kết thực sự đã tạo ra bản dựng đó. Tôi không quan tâm quá nhiều đến việc liệu số lượng xây dựng có tăng đơn điệu hay không, và vì vậy tôi đã bỏ yêu cầu đó để tôi có thể dễ dàng truy cập vào cam kết đã tạo ra một nhị phân nhất định.

Cuối cùng, tôi đã sửa đổi kịch bản đầu tiên của mình thành như sau:

# Set the build number to the decimal conversion of the short version of the current git SHA

# Get the short version of the current git SHA in hexadecimal
SHA=$(git rev-parse --short @)
# Uppercase any alphabetic chars in SHA (bc doesn't like lowercase hex numbers)
UPPERCASE_SHA=$(tr '[:lower:]' '[:upper:]' <<< "$SHA")
# Use bc to convert the uppercase SHA from hex to decimal
BUILD_NUM=$(bc <<< "ibase=16;obase=A;$UPPERCASE_SHA")
# Set our build number to that
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $BUILD_NUM" "${PROJECT_DIR}/${INFOPLIST_FILE}"

# To convert a build number back to a usable git SHA, run the following, substituting the build number for <build number>
# bc <<< "ibase=10;obase=16;<build number>"

Điều này chuyển đổi phiên bản ngắn của git SHA hiện tại thành số thập phân. Các ký tự thập lục phân không chơi tốt với các yêu cầu về số bản dựng của Apple, đó là lý do tại sao tôi phải làm điều này. Để chuyển đổi lại, bạn chỉ cần chạy một cái gì đó như thế này:

SHA=$(bc <<< "ibase=10;obase=16;<build number>")

trong bash, <build number>số xây dựng bạn nhận được từ nhị phân. Sau đó, chỉ cần chạy git checkout $SHA, và có bạn đi.

Bởi vì đây là bản chuyển thể của giải pháp Wil G Diesel , như đã đề cập ở trên, bạn cũng sẽ cần tập lệnh hậu xây dựng sau:

# Set the build number to "DEVELOPMENT"
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion DEVELOPMENT" "${PROJECT_DIR}/${INFOPLIST_FILE}"

mà giữ cho lịch sử git của bạn sạch sẽ.


Vì vậy, làm thế nào nó hoạt động, cho bạn sẽ được viết thông tin git Info.plist, mà chính nó được theo dõi bởi git?
trojanfoe

@trojanfoe Như tôi đã đề cập ở đầu câu trả lời, câu trả lời này là bản phóng tác của giải pháp Wil G Diesel. Như vậy, nó đòi hỏi cùng một kịch bản hậu xây dựng được sử dụng ở đó. Tôi đã thêm nó vào câu trả lời một cách rõ ràng.
ravron

2

Tôi đã thử quy trình sửa đổi và nó không hoạt động, bởi vì: -

  1. Xcode 4.2.1 thay đổi thư mục con xcuserdata trong .xcodeproj

  2. git lưu ý thay đổi trước đó trong Project-Info.plist

Sửa đổi sau đây khiến những điều này bị bỏ qua và chỉ đánh dấu các thay đổi chính hãng: -

if [ -n "$(find $dir \! -path "*xcuserdata*" \! -path "*.git" -newer $plist)" ]; then

2

Bạn có thể muốn làm điều này chỉ khi bạn lưu trữ (và tải lên TF chẳng hạn). Nếu không, số phiên bản của bạn có thể tăng lên rất nhanh ..

Trong lược đồ (Sản phẩm / Chỉnh sửa lược đồ / Lưu trữ / Hành động trước), bạn có thể thêm một tập lệnh sẽ chỉ được thực hiện khi bạn lưu trữ.

Ngoài ra, bạn có thể muốn đặt lại số bản dựng mỗi lần tăng phiên bản ứng dụng.

Điều cuối cùng, nếu bạn sử dụng kho lưu trữ thay thế, bạn có thể vô hiệu hóa một cách an toàn:

# if [ -n "$(find "$dir" \! -path "*xcuserdata*" \! -path "*.git" -newer "$plist")" ]; then
...
# else
    # echo "Not incrementing build number as source files have not changed"
# fi

Vì số bản dựng sẽ chỉ được tăng lên khi bạn lưu trữ ...

EDIT: Đúng những gì tôi đã nói, các hành động trước trong kho lưu trữ xảy ra sau khi xây dựng (nhưng trước khi lưu trữ), vì vậy số lượng bản dựng sẽ tăng lên cho kho lưu trữ tiếp theo ... Nhưng bạn có thể tạo một sơ đồ mới và thêm hành động này vào bản dựng (trước hành động) phần của chương trình mới này. và sử dụng lược đồ này khi bạn muốn tạo một bản dựng mới


1
Vâng, nó đang tăng lên nhanh chóng (5500+ vào lúc này), nhưng đó không phải là vấn đề đối với tôi; nó chỉ là một con số Thật thú vị khi Cmd-B / Cmd-R bị tấn công bao nhiêu lần trước khi mọi thứ thậm chí hoạt động ...
trojanfoe

2

Tôi sử dụng bản sửa đổi SVN cuối cùng cho số bản dựng. Nếu bạn thay đổi Info.plist trong thư mục bản dựng, bạn sẽ không ảnh hưởng đến Info.plist nguồn:

# use the last SVN revision as the build number:
Info_plist="$BUILT_PRODUCTS_DIR/$CONTENTS_FOLDER_PATH/Info.plist"
defaults write "${Info_plist}" CFBundleVersion `svn stat -u | awk '/'"Status against revision:"'/ {print $4}'`

2

Tôi cảm thấy như tôi đã tìm thấy bộ lạc của mình. Bộ lạc, tôi hy vọng bạn thích thú với VersionX.

Một thập kỷ trước khi làm việc trên một không gian làm việc có hơn 25 dự án Xcode trong đó, tôi đã có cơ hội tự động hóa phiên bản và xây dựng các bản cập nhật chuỗi ở mức độ có vẻ vô lý, nếu bạn chỉ duy trì một hoặc hai dự án với các cập nhật không thường xuyên.

Phiên bảnX:

  • biết về kiểu xây dựng (Phát hành / Gỡ lỗi)
  • thu thập thông tin tại thời điểm xây dựng từ kho lưu trữ (bao gồm hỗ trợ git, nhưng có thể được tùy chỉnh cho hg, svn hoặc bất cứ thứ gì bạn sử dụng)
  • được cung cấp cho các chuỗi phiên bản tiếp thị ưa thích có thể tùy chỉnh dễ dàng (có nhiều biến thể hơn trước khi App Store áp đặt quy ước) để bạn có thể tự động tăng các chuỗi bao gồm các ký hiệu cho "beta" bằng cách sử dụng quy ước thẻ git.
  • bao gồm một lớp được điền với các biến thể hiện chứa phiên bản và thông tin cam kết. Điều này hữu ích để điền vào bảng điều khiển của bạn và xây dựng chuỗi ghi nhật ký, báo cáo sự cố hoặc báo cáo lỗi email của người dùng với thông tin được điền trước.

Nó là thú vị để thực hiện. Tôi đã học được một thuyền về hệ thống xây dựng Xcode.

Đây là một ví dụ về loại Phiên bản ưa thích và Chuỗi xây dựng VersionX có thể tự động tạo.

Phiên bảnX 1.0.1 7 (c5959a3 Kiếm Sạch)

Phiên bản tiếp thị: VersionX 1.0.1 β7 "1.0.1 được lấy từ thẻ cho cam kết, trong khi Phiên bản Beta 7 7 được tự động tạo bởi số lượng cam kết hoặc số lượng bản dựng (ví dụ).

Phiên bản bản dựng: (c5959a3 Hồi sạch) Hiển thị hàm băm cam kết ngắn và thông báo cho bạn rằng thư mục bản dựng không có thay đổi không được cam kết.

VersionX (nguồn tại GitHub) - một hệ thống baroque để tự động tăng phiên bản và xây dựng chuỗi trong các dự án Xcode.

Tài liệu VersionX.


1

Bạn có thể muốn kiểm tra một công cụ mới mà tôi đã phát triển có tên là Xcodebump. Nó có thể xử lý cập nhật cả CFBundleShortVersionString và CFBundleVersion. Bước cuối cùng, nó cũng sẽ đăng nhập để git và gắn thẻ cam kết để khớp với các giá trị CFBundle đó.

Các dự án Xcodebump nằm ở đây:

https://github.com/markeissler/Xcodebump


1

Tôi cập nhật build numbertheo phương pháp sau.

$INFO_FILElà đường dẫn của tệp plist. Và $build_numberlà một số xây dựng mới cho tòa nhà này.

/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $build_number" "${INFO_FILE}"

Nói chung, của tôi $build_numberđược sáng tác bởi majorminorcác bộ phận. Điều minornày đến từ thông tin dự án. Vì vậy, tôi mô tả làm thế nào để tạo ra majormột phần.

## Composed by `major` and `minor`. 
## `minor` is parsed from project information. It's another story.
## Examples: `21.1`, or `21.1.3`
build_number="${major_number}.${minor_number}"

Tôi có 2 chiến lược để quyết định $build_number.

Chiến lược đầu tiên

Chiến lược này sử dụng git tagsố quyết định majorcủa build number. Nếu có 53các thẻ của dự án, nó sẽ trả về 53bằng cách theo kịch bản shell.

Nói chung, nó đang tăng lên. Và nó sẽ buộc nhà phát triển đặt một thẻ git trước khi xuất bản.

major_number=$(git tag -l | wc -l | grep -oE "\d+")

Chiến lược thứ hai

Hãy để hệ thống CI của Jenkins quyết định majorphần. Nó có một biến môi trường BUILD_NUMBER. Nó đang tăng tự động khi xây dựng trên hệ thống CI. Thông tin này rất hữu ích để theo dõi lịch sử dự án trên hệ thống CI.

major_number=${BUILD_NUMBER}

1

Đây là một phiên bản cập nhật. Điều này hoạt động kể từ Xcode 9.3.1, iOS 11.

Nhấp vào 'Xây dựng giai đoạn' từ mục tiêu ứng dụng của bạn, nhấp vào biểu tượng + để thêm tập lệnh chạy mới và trong hộp, dán mã này.

buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${PROJECT_DIR}/${INFOPLIST_FILE}")
buildNumber=$(($buildNumber + 1))
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${PROJECT_DIR}/${INFOPLIST_FILE}"

Đi vào tệp Info.plist và đặt 'Phiên bản gói' thành 1 và chuỗi 'Phiên bản gói, ngắn' thành 1, bạn nên đặt.

Xây dựng dự án với Info.plist trong chế độ xem và bạn sẽ thấy phiên bản Gói (Số bản dựng) thay đổi.

  • Lưu ý rằng kể từ Xcode 9.3.1, bạn sẽ không thể thấy những thay đổi này từ tab chung, nhưng sẽ thấy những thay đổi khi bạn lưu trữ bản dựng và trong Info.plist

0

Đây là giải pháp của tôi. Nếu bạn giống tôi: thân thiện với thiết bị đầu cuối, như ruby, như phiên bản ngữ nghĩa, hãy thử điều này.

Tạo một tệp có tên Rakefilenày:

require "xcodeproj"
require "versionomy"

XCODEPROJECT = "MyProject.xcodeproj"
INFOPLISTFILE = "MyProject/MyProject-Info.plist"

$UPDATES = [:major,:minor,:tiny]
$UPDATES.each { |part|
  desc "increment #{part} part of version"
  task "increment:#{part}" do |task|
    version=`/usr/libexec/Plistbuddy -c "Print CFBundleVersion" #{INFOPLISTFILE}`.chomp
    version=Versionomy.parse(version)
    version=version.bump(part)

    # I use the same string for CFBundleVersion and CFBundleShortVersionString for now
    `/usr/libexec/PlistBuddy -c "Set :CFBundleVersion #{version}" #{INFOPLISTFILE}`
    `/usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString #{version}" #{INFOPLISTFILE}`
    print "version upgraded to #{version}\n"
  end
}

Chuẩn bị: gem install xcodeproj versionomy

Chạy: rake increment:majorhoặc rake increment:minorhoặc rake increment:tinybất cứ khi nào bạn muốn.


0

Tôi thấy thuận tiện nhất khi sử dụng Phiên bản tự động và xây dựng số bằng cách sử dụng agvtool .

Thử cái này:

  1. Định cấu hình nó như được mô tả trong tài liệu của Apple được liên kết ở trên.
  2. Thêm tập lệnh dưới dạng Hành động trước vào Dự án -> Chỉnh sửa lược đồ ... -> Lưu trữ (hoặc cách khác nếu bạn muốn)
  3. Đặt: Cung cấp cài đặt bản dựng từ <your_app_target>

Kịch bản (dòng đầu tiên là tùy chọn):

exec > ${PROJECT_DIR}/prebuild.log 2>&1
cd ${PROJECT_DIR}
xcrun agvtool next-version -all
cd -

0

Hãy làm điều này theo cách riêng của Apple. Nó sẽ tăng số lượng bản dựng sau mỗi lần xây dựng thành công

Tôi sẽ hướng dẫn bạn qua 5 hình ảnh, chỉ cần đi qua nó.

  1. Chọn 'Chỉnh sửa lược đồ ...' từ danh sách thả xuống, khi bạn chọn tên Dự án nằm ở bên phải vào Stop_build_button. Kiểm tra bước đầu tiên

  2. Từ menu bên trái mở rộng tùy chọn 'Build' và chọn 'Post-action' Kiểm tra Bước thứ hai

  3. Tại đây, bạn có thể thêm Mã mong muốn (Tập lệnh) mà bạn muốn thực thi sau khi xây dựng thành công chương trình của mình. Đó là nơi chúng ta phải thêm một ít mã để làm cho tự động hóa của chúng ta hoạt động hoàn hảo. >> 1. chọn nút 'thêm (+)' từ góc bên trái để thêm tệp tập lệnh mới >> 2. Bây giờ từ trình đơn thả xuống, chọn 'Hành động tập lệnh chạy mới' Kiểm tra Bước thứ ba

  4. Nó có 3 trường >> 1. shell đã được gán cho bạn >> 2. bây giờ cho 'Cung cấp cho bạn cài đặt bản dựng từ' Chọn Tên dự án của bạn. >> 3. Có một lĩnh vực lớn để thêm Tập lệnh của bạn, chỉ cần sao chép và dán mã này vào đó: Kiểm tra Bước thứ tư

    PLIST = "$ {PRO DỰ_DIR} / $ {INFOPLIST_FILE}" PLB = / usr / libexec / PlistBuddy LAST_NUMBER = $ ($ PLB -c "In CFBundleVersion" "$ PLIST") NEW_VERSION = ($ 1) PLB -c "Đặt: CFBundleVersion $ NEW_VERSION" "$ PLIST"

  5. Sau khi hoàn thành bước thứ 4, chỉ cần chọn 'Đóng' để đóng cửa sổ và chúng tôi phải thực hiện bước cuối cùng, Goto tệp 'plist.info' của bạn trong menu tệp Dự án và đảm bảo khóa 'Gói phiên bản' trong phần 'Khóa' chứa nhiều nhất Kiểm tra giá trị số Bước thứ năm

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.