使用xcodebuild分离构建目录

Dav*_*eer 15 macos xcodebuild

xcodebuild读取的手册页:

从包含项目的目录(即包含projectname.xcodeproj包的目录)运行xcodebuild.

我想保持我的源目录(这是一个Subversion外部)干净且未修改,并将我的目标文件和可执行文件构建到完全位于源目录之外的位置.

是否有任何方法xcodebuild可以使用make工具甚至msbuildWindows上的方式从终端构建单独的构建目录?

Dav*_*eer 31

您可以从命令行设置构建设置.该CONFIGURATION_BUILD_DIR会设置生成目录.例如:

xcodebuild -project YourProject.xcodeproj -configuration Debug -target All ARCHS=x86_64 ONLY_ACTIVE_ARCH=YES CONFIGURATION_BUILD_DIR=../some/other/dir
Run Code Online (Sandbox Code Playgroud)

在Apple的网站上可以找到参考:

  • 我发现我还需要设置CONFIGURATION_TEMP_DIR,然后这对我有用. (4认同)
  • 你可以设置BUILD_DIR,它也可以工作:D (2认同)

Sta*_*ich 7

要实现完全分离,必须更改以下构建设置(不仅仅是CONFIGURATION_BUILD_DIR接受的答案建议),否则Xcode仍会在其默认构建文件夹下构建一些工件.

在我的机器的Xcode通常会生成一切./Build./DerivedData地方当前目录是我的项目之一.

我希望xcodebuild在Build-command-line文件夹下构建所有内容,以便我xcodebuild -scheme MyScheme -showBuildSettings | grep Build\/找到与所有构建路径相对应的所有构建设置,并通过trial-end-error我发现"生成"构建设置足以将xcodebuild生成的所有构建工件重定向到自定义夹.

我最终使用以下命令:

BUILD_DIR=./Build-command-line
DERIVED_DATA_DIR=$(BUILD_DIR)/DerivedData

xcodebuild -project MyProject.xcodeproj \
         -IDEBuildOperationMaxNumberOfConcurrentCompileTasks=`sysctl -n hw.ncpu` \
         -scheme MyScheme \
         -sdk iphonesimulator \
         -destination 'platform=iOS Simulator,name=iPhone 6S Plus,OS=latest' \
         -xcconfig command-line-build.xcconfig \
         -derivedDataPath $(DERIVED_DATA_DIR) \
         test
Run Code Online (Sandbox Code Playgroud)

在哪里command-line-build.xcconfig:

HERE_BUILD=$(SRCROOT)/Build-command-line
HERE_INTERMEDIATES=$(HERE_BUILD)/Intermediates

// Paths
// the following paths are enough to redirect everything to $HERE_BUILD
MODULE_CACHE_DIR    = $(HERE_BUILD)/DerivedData/ModuleCache
OBJROOT             = $(HERE_INTERMEDIATES)
SHARED_PRECOMPS_DIR = $(HERE_INTERMEDIATES)/PrecompiledHeaders
SYMROOT
Run Code Online (Sandbox Code Playgroud)

注意:确保在xcconfig中使用绝对路径,否则可能会出现错误:Xcode在启动时崩溃"parentPath必须为nil但不是.

我已经写了一篇关于这个解决方案的帖子,有一些背景知识:xcodebuild:如何真正改变它的构建路径.

PS当然,这些信息可能会有所变化,但Xcode Version 7.3.1 (7D1014)对我来说,它的效果非常好.


Ash*_*ley 5

在我的项目中,设置SYMROOT足以在不同的位置构建项目,而其他位置保持不变。

来自 Apple 的Xcode 构建设置参考(我是通过这里的另一个答案遇到的,谢谢!):

SYMROOT(构建产品路径)

说明:目录路径。标识包含产品文件和中间构建文件的目录层次结构的根。产品和构建文件放置在此目录的子目录中。

...

影响:BUILT_PRODUCTS_DIR、CONFIGURATION_BUILD_DIR (...)

xcodebuild手册页中也多次提到此设置:

可用的操作有:

构建:在构建根(SYMROOT)中构建目标...

清洁:从构建根 (SYMROOT) 中删除构建产品和中间文件。...

  • 如果您想将**所有内容**重定向到自定义文件夹,至少`OBJROOT`非常重要,因为相当多的文件夹依赖于它,而不是`SYMROOT`。我刚刚检查过 Xcode 7.3.1 - MODULE_CACHE_DIR 和 SHARED_PRECOMPS_DIR 也独立于 `SYMROOT`。因此,您的答案仍然会在默认构建目录中构建一些内容,但是也许这对于您的任务来说已经足够了。 (2认同)

Guy*_*her 5

Xcode 10

对于工作区,如果您使用 CocoaPods:

xcodebuild -workspace youProject.xcworkspace -scheme yourScheme -sdk iphonesimulator -configuration Release SYMROOT=$(PWD)/build
Run Code Online (Sandbox Code Playgroud)

这会将您的 .app 放入 ./build/Release-iphonesimulator