【问题标题】:xcodebuild of cocoapods project with PRODUCT_NAME fails使用 PRODUCT_NAME 构建 cocoapods 项目的 xcodebuild 失败
【发布时间】:2014-06-14 04:59:15
【问题描述】:

我可以使用以下命令构建我的 Cocoapods 项目:

 base=$(basename *.xcworkspace .xcworkspace)    xcodebuild -sdk "iphonesimulator$ios_version" \
 CONFIGURATION_BUILD_DIR="$build_dir/build" \
 -workspace $base.xcworkspace -scheme $base -configuration AdHoc \
 DSTROOT=$build_dir \
 OBJROOT=$build_dir \
 SYMROOT=$build_dir \
 ONLY_ACTIVE_ARCH=NO \
 "$@"

但是,如果我使用此命令,它会失败:

 base=$(basename *.xcworkspace .xcworkspace)    xcodebuild -sdk "iphonesimulator$ios_version" \
 CONFIGURATION_BUILD_DIR="$build_dir/build" \
 -workspace $base.xcworkspace -scheme $base -configuration AdHoc \
 PRODUCT_NAME=app \   <============= THIS IS THE EXTRA LINE =====
 DSTROOT=$build_dir \
 OBJROOT=$build_dir \
 SYMROOT=$build_dir \
 ONLY_ACTIVE_ARCH=NO \
 "$@"

更奇怪的是,如果我使用第一个命令,然后使用第二个命令,它将起作用。 (删除构建目录进行重置。)

其他人是否遇到同样的问题?是否可以通过其他方式同时使用 PRODUCT_NAME 和 CONFIGURATION_BUILD_DIR 构建一个 cocoapods 项目?

【问题讨论】:

  • 我可以确认我看到了这个问题。

标签: xcode cocoa cocoapods xcodebuild


【解决方案1】:

我有同样的问题,并找到了问题的根本原因。

环境:Xcode 6.1 (6A1052c)、OSX 10.10 (14A389)

问题

原因是 PRODUCT_NAME 属性不仅会影响构建的 *.app,还会影响 CocoaPods 的库 *.a 文件。

我尝试了 Dean 和 Joel 的解决方案,但对我不起作用。 在我的场景中,我需要构建许多 *.app 文件,这些文件具有不同的产品名称,并且图像资源和设置略有不同。因此,我想在构建脚本中构建不同的 *.app 文件,只需单击即可触发该过程。

如果我们在以下命令中使用 *.xcworkspace 在 xcodebuild 的选项中设置 PRODUCT_NAME,会发生以下情况:

xcodebuild -workspace $PROJECT_NAME.xcworkspace \
           -scheme $PROJECT_NAME \
           -configuration Distribution \
           CONFIGURATION_BUILD_DIR=$PROJECT_SRC/build \
           PRODUCT_NAME=$NEW_PRODUCT_NAME build
  1. xcodebuild 构建 $NEW_PRODUCT_NAME.app
  2. xcodebuild 构建名为 $NEW_PRODUCT_NAME.a 的 CocoaPods 的 *.a 库文件,应该是 libPods-CocoaLumberjack.alibPods.a
  3. 在链接器步骤中,项目设置要求通过属性 -lPods-lPods-CocoaLumberjack 与库链接强>。 由于库文件也受 PRODUCT_NAME 属性的影响,链接器无法找到 find *.a 文件。
  4. 构建失败

根据 Dean 的解决方案,即使将 PRODUCT_NAME 配置写入 *.xcconfig 文件,问题仍然存在。

对于 Joel 的解决方案,xcodebuild 命令之前的 PRODUCT_NAME 配置对新产品名称无效。

对于福尔的问题:

更奇怪的是,如果我使用第一个命令,然后使用第二个命令,它将起作用。 (删除构建目录进行重置。)

这是因为第一个构建已经构建了必不可少的 *.a CocoaPods 文件。即使第二次构建一些 $NEW_PRODUCT_NAME.a 文件(未使用),链接器步骤所需的 *.a 文件也已经存在用于链接。这就是第二个构建过程成功的原因。

我的解决方案

最后,我的解决方案是分别构建项目和 CocoaPods 库

  1. 在项目的 src 文件夹中
  2. 使用以下命令构建 CocoaPods 库

    xcodebuild -project Pods/Pods.xcodeproj build
    
  3. 使用以下命令构建项目并在搜索路径中添加 CocoaPods 和其他必要的库(不要忘记包含所有必要的库

    xcodebuild -project $(TARGET_PROJ) \
               -configuration Distribution \
               -target $(TARGET_TAR) \
               PRODUCT_NAME=$(NEW_PRODUCT_NAME) \
               LIBRARY_SEARCH_PATHS="./Pods/build/Release-iphoneos $OTHER_PATH" 
    
  4. 构建!

这些对我有用,可以为相同的二进制文件提供一键式构建脚本,但有一些不同的 图像和设置。希望这能帮助遇到同样问题的人。

【讨论】:

  • 我现在面临同样的问题。当我单独构建 pods 项目时,我的根项目的构建失败,因为找不到 pod 依赖项,就像您在“(不要忘记包含所有必要的库)”中提到的那样。但是,我无法将其用于工作。我必须在哪里包含它们?
【解决方案2】:

尝试创建一个配置文件并将 PRODUCT_NAME 和 CONFIGURATION_BUILD_DIR 变量移动到 xcodebuild 命令中的 xcconfig 标志。

您的 xcconfig 文本文件示例如下所示:

PRODUCT_NAME='This is my app'
CONFIGURATION_BUILD_DIR=/Users/myusername/Documents/myiosproject/build

将它传递到您的 xcodebuild 中:

xcodebuild [options and other args] -xcconfig mynewconfig.xcconfig

可能需要清理并删除 DerivedData 以获得良好的效果,并可能尝试构建命令几次。 xcodebuild 命令行似乎很挑剔。

编辑:如果可以的话,我建议给 xctools 一个机会。它让我对 xcodebuild 的头痛消失了。

【讨论】:

    【解决方案3】:

    我找到了答案。你需要把PRODUCT_NAME=MyProductName放在之前xcodebuild命令给出。

    所以

    # This does NOT work
    xcodebuild ... options ... PRODUCT_NAME=MyProductName
    
    # This DOES work
    PRODUCT_NAME=MyProductName xcodebuild ... options ...
    

    不知道为什么这第二个有效,而第一个无效。我推测第二种形式允许设置更深入地渗透到 xcodebuild 委托给的链接器和其他子命令,作为更好的 env var 设置,而第一种则不允许。但这只是猜测。无论如何,第二种形式有效。

    我已经在 OS X 10.9.2 和 Xcode 5.1.1 中验证了这一点。

    祝你好运!

    【讨论】:

    • 它适用于您,因为当您将 PRODUCT_NAME 参数放在 xcodebuild 命令之前时,它不会被识别。
    猜你喜欢
    • 2014-06-01
    • 1970-01-01
    • 2014-10-30
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-22
    相关资源
    最近更新 更多