与PRODUCT_NAME的cocoapods项目的xcodebuild失败

时间:2014-04-28 15:06:27

标签: xcode cocoa cocoapods xcodebuild

我可以使用此命令构建我的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项目?

3 个答案:

答案 0 :(得分:4)

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

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

问题

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

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

如果我们在xcodebuild的选项中使用* .xcworkspace在以下命令中设置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构建* .a名为$ NEW_PRODUCT_NAME.a 的CocoaPods的libray文件,该文件应为 libPods-CocoaLumberjack.a 和<强> libPods.a enter image description here
  3. 在链接器步骤中,项目设置要求通过属性 -lPods -lPods-CocoaLumberjack 。 由于库文件也受PRODUCT_NAME属性的影响,因此链接器无法找到find * .a文件。 enter image description here
  4. 构建失败
  5. 根据Dean的解决方案,即使在* .xcconfig文件中写入PRODUCT_NAME配置,问题仍然存在。

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

    对于Full的问题:

      

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

    这是因为第一个构建已经构建了CocoaPods的基本* .a文件。即使是第二次构建一些$ 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. 构建<!/ p>

    5. 这些对我来说有一个单击构建脚本用于相同的二进制文件,但有一些不同 图像和设置。希望这能帮助那些遇到同样问题的人。

答案 1 :(得分:2)

我找到了答案。您需要在<{strong> 之前放置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验证了这一点。

祝你好运!

答案 2 :(得分: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感到头疼不已。