如何使用脚本在Xcode 11中更改构建设置版本控制?

14

自从Xcode 11将版本更改为$(MARKETING_VERSION),构建版本更改为$(CURRENT_PROJECT_VERSION)之后,构建设置中出现了新的字段。

enter image description here

由于 xcrun agvtool new-versionxcrun agvtool new-marketing-version 在 Xcode 10 上无法正常工作,我应该如何使用脚本更改此值?

我尝试了 https://dev59.com/Bbbna4cB1Zd3GeqPdJXG#58164679,但没有起作用。我只能从中获取正确的值:

echo $versionNumber 
echo $buildNumber

但是我该如何给它设置新的值呢?

2个回答

26

更新于 2022/08/19

如果使用 fastlane 来升级版本号

desc "Bump version and build nubmer"
lane :bump_version_and_build_number do |options|
    version_number = options[:version]
    puts version_number
    sh("sed -i '' -e 's/MARKETING_VERSION \\= [^\\;]*\\;/MARKETING_VERSION = #{version_number};/' ../${YOUR_PROJECT_NAME}.xcodeproj/project.pbxproj")
    increment_build_number
end

只需在命令行中输入以下内容:

bundle exec fastlane bump_version_and_build_number version:1.0.1


好的,我已经为自己找到了解决方案,感谢Meetup上的一个朋友。

关于版本号:

enter image description here

我用了这个:

sed -i '' -e 's/MARKETING_VERSION \= [^\;]*\;/MARKETING_VERSION = 3.4.5;/' ${YOUR_PROJECT_NAME}.xcodeproj/project.pbxproj

例如:sed -i '' -e 's/MARKETING_VERSION \= [^\;]*\;/MARKETING_VERSION = 3.4.5;/' DemoProject.xcodeproj/project.pbxproj

请注意,这不能在方案设置的预操作中工作。

至于构建版本:

enter image description here

我使用了 xcrun agvtool new-version xxx

例如:xcrun agvtool new-version 3.4.5b

你可以将这些命令写在“Build Phases”中。

enter image description here

我不使用 xcrun agvtool new-marketing-version 3.4.5b 是因为它会将固定的数字写入plist中。

我同意Manuel在 Post 中的答案。

通过这些,我可以管理多个目标的版本控制。

P.S. 如果你想对notificationService目标执行此操作,记得手动更改版本和构建号,以便Xcode 11将相应值更改为类似于这样的变量:

enter image description here

或者你当然也可以通过编辑源代码中的plist来实现。

这是我迄今为止实现多目标版本控制的最接近方法。


谢谢。正则表达式对我没用,但这个命令可以:sed -i'' -e "s/MARKETING_VERSION = .*;/MARKETING_VERSION = $VERSION;/" $PROJECT_PATH/project.pbxproj - gabe

2
以下脚本将设置$MARKETING_VERSION$CURRENT_PROJECT_VERSION,类似于Xcode,并最终准备一个存档,该存档也将出现在XCode Organizer中。
#!/bin/bash

# Set the version and build numbers
VERSION_NUMBER="2.1.0"
BUILD_NUMBER="29"
APP_NAME="MyApp"
TEAM_ID="ABCDEFGH"

# Set the Xcode project file path
PROJECT_FILE="$APP_NAME.xcodeproj/project.pbxproj"

# Update the MARKETING_VERSION and CURRENT_PROJECT_VERSION values in the project file
sed -i "" "s/MARKETING_VERSION = .*/MARKETING_VERSION = $VERSION_NUMBER;/g" "$PROJECT_FILE"
sed -i "" "s/CURRENT_PROJECT_VERSION = .*/CURRENT_PROJECT_VERSION = $BUILD_NUMBER;/g" "$PROJECT_FILE"

# Set the archive path
ARCHIVE_DATE=$(date +"%Y-%m-%d")
ARCHIVE_TIME=$(date +"%H.%M")
ARCHIVE_FILENAME="$APP_NAME $ARCHIVE_DATE, $ARCHIVE_TIME.xcarchive"
ARCHIVE_PATH="~/Library/Developer/Xcode/Archives/$ARCHIVE_DATE/$ARCHIVE_FILENAME"

# Archive the Xcode project
xcodebuild \
  -scheme "$APP_NAME" \
  -project "$APP_NAME.xcodeproj" \
  -configuration "Release" \
  -destination "generic/platform=iOS" \
  -archivePath "$ARCHIVE_PATH" \
  archive 

这是一个完美的答案,其他所有在SO上的答案要么过时,要么需要一些额外的设置。即使是一个被接受的答案也使用了shell sed - 这使得根本不需要使用fastlane。 - iago849

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接