从命令行生成xcarchive到特定文件夹

Chr*_*ris 33 archive xcode4 ipa

出于CI的目的,我需要能够在我们的每晚构建中生成XCARCHIVE和IPA文件.IPA适用于我们的测试人员,使用我们的临时密钥签名,XCARCHIVE将发送给客户端,以便他们可以将其导入Xcode并在他们满意时将其提交到应用商店.

通过一些谷歌搜索来生成IPA很简单,但是如何生成.XCARCHIVE文件是我的目标.我发现的最接近的是:

xcodebuild -scheme myscheme archive
Run Code Online (Sandbox Code Playgroud)

但是,这会将.xcarchive存储在一些难以找到的文件夹中,例如:

/Users/me/Library/Developer/Xcode/Archives/2011-12-14/MyApp 14-12-11 11.42 AM.xcarchive
Run Code Online (Sandbox Code Playgroud)

有没有办法控制存档的放置位置,名称是什么,以及如何避免重新编译它?我想最好的结果是从你执行'xcodebuild构建'时生成的DSYM和APP生成xcarchive - 这可能吗?

rec*_*gic 53

Xcode 5现在支持一个-archivePath选项:

xcodebuild -scheme myscheme archive -archivePath /path/to/AppName.xcarchive
Run Code Online (Sandbox Code Playgroud)

您现在还可以从刚刚构建的存档中导出已签名的IPA:

xcodebuild -exportArchive -exportFormat IPA -exportProvisioningProfile my_profile_name -archivePath /path/to/AppName.xcarchive -exportPath /path/to/AppName.ipa
Run Code Online (Sandbox Code Playgroud)

  • 在 Xcode 6.1 中尝试过,最终在 `-archivePath` 处有一个空文件夹,而真正的存档位于默认位置。 (2认同)

Aro*_*ron 41

从Xcode 4 Preview 5开始,可以在scheme archive的后期操作中访问三个环境变量.

ARCHIVE_PATH: The path to the archive.
ARCHIVE_PRODUCTS_PATH: The installation location for the archived product.
ARCHIVE_DSYMS_PATH: The path to the product’s dSYM files.
Run Code Online (Sandbox Code Playgroud)

您可以在此处移动/复制存档.我想在CI脚本中对进程有一点控制权,所以我保存了一个临时文件,可以很容易地在我的CI脚本中找到包含这些值的文件.

BUILD_DIR=$PROJECT_DIR/build
echo "ARCHIVE_PATH=\"$ARCHIVE_PATH\"" > $BUILD_DIR/archive_paths.sh
echo "ARCHIVE_PRODUCTS_PATH=\"$ARCHIVE_PRODUCTS_PATH\"" >> $BUILD_DIR/archive_paths.sh
echo "ARCHIVE_DSYMS_PATH=\"$ARCHIVE_DSYMS_PATH\"" >> $BUILD_DIR/archive_paths.sh
echo "INFOPLIST_PATH=\"$INFOPLIST_PATH\"" >> $BUILD_DIR/archive_paths.sh
Run Code Online (Sandbox Code Playgroud)

然后在我的CI脚本中,我可以运行以下命令:

xcodebuild -alltargets -scheme [Scheme Name] -configuration [Config Name] clean archive
source build/archive_paths.sh
ARCHIVE_NAME=AppName-$APP_VERSION-$APP_BUILD.xcarchive
cp -r "$ARCHIVE_PATH" "$BUILD_DIR/$ARCHIVE_NAME"
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你,谢谢你,谢谢你!你到底怎么找到这个?我已经梳理了几天的文档,寻找类似的东西. (4认同)

Oli*_*gey 9

我刚刚解决了这个问题 - 只需将参数添加-archivePath到xcode构建命令行,给出初始问题意味着:

xcodebuild -scheme myscheme archive
Run Code Online (Sandbox Code Playgroud)

变得......

xcodebuild -scheme myscheme archive -archivePath Build/Archive
Run Code Online (Sandbox Code Playgroud)

(注意:路径是相对的,我输出我的构建$PWD/Build)

然后将您的.app文件夹放在:

Build/Archive.xarchive/Products/Application
Run Code Online (Sandbox Code Playgroud)

如果构建目标中已包含签名证书和配置文件,则可以使用以下命令创建IPA文件而无需重新签名:

xcrun -v -sdk iphoneos PackageApplication -v `pwd`'/Build/Archive.xarchive/Products/Application/my.app' -o `pwd`'/myapp.ipa'
Run Code Online (Sandbox Code Playgroud)

(注意:xcrun不喜欢相对路径因此pwd)

-v args转储了许多有用的信息 - 这个命令无法正确签名并仍然以代码0退出,叹息!

如果您发现无法运行构建的.ipa,则可能是签名问题,您可以使用以下方法进行双重检查:

codesign --verify -vvvv myapp.app
Run Code Online (Sandbox Code Playgroud)

如果它被正确签名并且未被篡改输出将具有:

myapp.app: valid on disk
myapp.app: satisfies its Designated Requirement
Run Code Online (Sandbox Code Playgroud)

如果没有,你会看到类似的东西:

Codesign check fails : /blahpath/myapp.app: a sealed resource is missing or invalid
file modified: /blahpath/ls-ios-develop.app/Assets.car
Run Code Online (Sandbox Code Playgroud)

...通常意味着您尝试使用中间输出目录而不是正确的存档.


Chr*_*ris 2

我当前的解决方案是重命名用户现有的存档文件夹,运行构建,然后执行“查找”以将存档复制到我想要的位置,然后删除存档文件夹并将旧文件夹重命名回原来的样子,代码如下我的红宝石构建脚本:

# Move the existing archives out of the way
system('mv ~/Library/Developer/Xcode/Archives ~/Library/Developer/Xcode/OldArchivesTemp')
# Build the .app, the .DSYM, and the .xcarchive
system("xcodebuild -scheme \"#{scheme}\" clean build archive CONFIGURATION_BUILD_DIR=\"#{build_destination_folder}\"")
# Find the xcarchive wherever it was placed and copy it where i want it
system("find ~/Library/Developer/Xcode/Archives -name *.xcarchive -exec cp -r {} \"#{build_destination_folder}\" \";\"")
# Delete the new archives folder with this new xcarchive
system('rm -rf ~/Library/Developer/Xcode/Archives')
# Put the old archives back
system('mv ~/Library/Developer/Xcode/OldArchivesTemp ~/Library/Developer/Xcode/Archives')
Run Code Online (Sandbox Code Playgroud)

它有点老套,但我目前没有看到更好的解决方案。至少它保留了用户的“档案”文件夹及其所有预先存在的档案。

- 重要的提示! -

我发现我找到存档并将其复制到我想要的文件夹的代码行没有正确复制存档内的符号链接,从而破坏了应用程序中的代码签名。您需要将其替换为“mv”或维护符号链接的内容。干杯!