PhoneGap如何从命令行进行发布构建

时间:2012-09-30 09:23:12

标签: objective-c xcode cordova xcodebuild

我通过调用:

来发布版本
xcodebuild -project HelloWorld -sdk iphoneos5.1 -configuration Release install

但对于PhoneGap应用程序,我收到此错误:

  

**建筑失败**

     

以下构建命令失败:       CompileC build / Phonefinch.build / Release-iphoneos / Phonefinch.build / Objects-normal / armv6 / AppDelegate.o Phonefinch / Classes / AppDelegate.m normal armv6 objective-c com.apple.compilers.llvm.clang.1_0.compiler   (1失败)

当我尝试:

xcodebuild -project HelloWorld -sdk iphoneos5.1 -configuration Release clean build

我明白了:

  

2012-10-04 22:51:52.776 xcodebuild [20016:4107] DVTAssertions:/ SourceCache/IDEXcode3ProjectSupport/IDEXcode3ProjectSupport-1559/Xcode3Sources/XcodeIDE/Frameworks/DevToolsBase/pbxcore/SpecificationTypes/XCGccMakefileDependencies.m:87中的警告   详细信息:无法从“/Users/camobap-mac/Projects/Phonefinch/build/Phonefinch.build/Release-iphoneos/Phonefinch.build/Objects-normal/armv6/AppDelegate.d”加载依赖项输出内容。错误:错误Domain = NSCocoaErrorDomain Code = 260“无法打开文件”AppDelegate.d“,因为没有这样的文件。” UserInfo = 0x400eabf40 {NSFilePath = / Users / camobap-mac / Projects / Phonefinch / build / Phonefinch.build / Release-iphoneos / Phonefinch.build / Objects-normal / armv6 / AppDelegate.d,NSUnderlyingError = 0x40079c140“操作无法完成。没有这样的文件或目录“}。用户信息: {       NSFilePath =“/ Users / camobap-mac /Projects / Phonefinch / build / Phonefinch.build / Release -iphoneos / Phonefinch.build / Objects-normal / armv6 / AppDelegate.d”;       NSUnderlyingError =“错误域= NSPOSIXErrorDomain代码= 2 \”操作无法完成。没有相应的文件和目录\””;   }。   功能:void XCGccMakefileDependenciesParsePathsFromRuleFile(NSString *,void(^)(NSString *))   线程:{name =(null),num = 7}   请在http://bugreport.apple.com上提交此警告消息以及您可以提供的任何有用信息。   **建筑失败**

     

以下构建命令失败:       CompileC build / Phonefinch.build / Release-iphoneos / Phonefinch.build / Objects-normal / armv7 / AppDelegate.o Phonefinch / Classes / AppDelegate.m normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler       CompileC build / Phonefinch.build / Release-iphoneos / Phonefinch.build / Objects-normal / armv6 / AppDelegate.o Phonefinch / Classes / AppDelegate.m normal armv6 objective-c com.apple.compilers.llvm.clang.1_0.compiler   (2次失败)   2012-10-04 22:52:04.887 xcodebuild [20016:4f0f] DVTAssertions:/SourceCache/IDEXcode3ProjectSupport/IDEXcode3ProjectSupport-1559/Xcode3Sources/XcodeIDE/Frameworks/DevToolsBase/pbxcore/SpecificationTypes/XCGccMakefileDependencies.m:87中的警告   详细信息:无法从“/Users/camobap-mac/Projects/Phonefinch/build/Phonefinch.build/Release-iphoneos/Phonefinch.build/Objects-normal/armv6/MainViewController.d”加载依赖项输出内容。错误:错误Domain = NSCocoaErrorDomain Code = 260“无法打开文件”MainViewController.d“,因为没有这样的文件。” UserInfo = 0x400ef6e40 {NSFilePath = / Users / camobap-mac / Projects / Phonefinch / build / Phonefinch.build / Release-iphoneos / Phonefinch.build / Objects-normal / armv6 / MainViewController.d,NSUnderlyingError = 0x400ef24a0“操作无法完成。没有这样的文件或目录“}。用户信息: {       NSFilePath =“/ Users / camobap-mac/Projects/Phonefinch/build/Phonefinch.build/Release-iphoneos/Phonefinch.build/Objects-normal/armv6/MainViewController.d”;       NSUnderlyingError =“错误域= NSPOSIXErrorDomain代码= 2 \”操作无法完成。没有相应的文件和目录\””;   }。   功能:void XCGccMakefileDependenciesParsePathsFromRuleFile(NSString *,void(^)(NSString *))   线程:{name =(null),num = 10}   请在http://bugreport.apple.com上提交此警告消息以及您可以提供的任何有用信息。   **建筑失败**

     

以下构建命令失败:       CompileC build / Phonefinch.build / Release-iphoneos / Phonefinch.build / Objects-normal / armv6 / AppDelegate.o Phonefinch / Classes / AppDelegate.m normal armv6 objective-c com.apple.compilers.llvm.clang.1_0.compiler       CompileC build / Phonefinch.build / Release-iphoneos / Phonefinch.build / Objects-normal / armv6 / MainViewController.o Phonefinch / Classes / MainViewController.m normal armv6 objective-c com.apple.compilers.llvm.clang.1_0.compiler   (2次失败)

如果我致电cordova/debug - > ** BUILD SUCCESS **,但我的.app是在调试模式下编译的。如何在命令行上构建发布版本?

4 个答案:

答案 0 :(得分:3)

我有完全相同的问题。我不知道我的解决方案是否适用于您的问题。但是,这是我如何解决它:我想你正在使用Xcode项目中的cordova子项目。检查cordova项目的配置名称是否相同。

例如:当您的主项目的发布配置名为“ReleaseAdHoc”时,请确保您的cordova子项目也具有此名称的配置。此外,请确保为主项目和子项目的“归档”过程选择这些配置。

希望这有帮助。

答案 1 :(得分:1)

我找到了解决方案 - cordova实用程序是关键。但我们需要采取一些措施来准备它:

  1. 将脚本添加到hooks/after_build/010_sign_ios.js

    #!/usr/bin/env node
    
    var app_name = "HelloWorld";
    var sign_crt_name = "iPhone Distribution: My company Group BV";
    var provision_path = "$PWD/Ad_Hock_Distribution_Helloworld.mobileprovision";
    
    var output_ipa_path = "$PWD/platforms/ios/build/device/" + app_name + ".ipa";
    var sys = require('sys');
    var exec = require('child_process').exec;
    
    var cliCommand = process.env.CORDOVA_CMDLINE;
    var isRelease = (cliCommand.indexOf('--release') > -1);
    var isDevice = (cliCommand.indexOf('--device') > -1);
    var platform = process.env.CORDOVA_PLATFORMS;
    
    if (platform === 'ios' && isDevice && isRelease) {
        function puts(error, stdout, stderr) {
            sys.puts(stdout)
        }
    
        exec("xcrun -sdk iphoneos PackageApplication " + 
             "-v \"$PWD/platforms/ios/build/device/" + app_name + ".app\" " +
             "-o \"" + output_ipa_path + "\" " + 
             "--sign \"" + sign_crt_name + "\" " + 
             "--embed \"" + provision_path + "\"", puts);
    }
    

    但根据您的需要修复app_namesign_crt_nameprovision_path个变量

  2. 运行cordova build ios --release --device

  3. 使用$PWD/platforms/ios/build/device/HelloWorld.ipa通过优秀ideviceinstaller工具

  4. 通过cmd投放或安装

答案 2 :(得分:1)

似乎很少有资源可以指导如何自动为ios进行phonegap构建过程。经过大量的反复试验和研究后,我决定采用这种方法。首先按照cordova docs中所述在根文件夹中创建一个文件json文件。文件名可以是任何东西。如果文件名为build.json,则在构建应用程序时无需传递任何参数。为了方便起见,推荐使用build.json进行自动签名,如下所示:

{
    "ios": {
        "debug": {
            "codeSignIdentity": "iPhone Developer",
            "developmentTeam": "FG35JLLMXX4A",
            "packageType": "development",
            "automaticProvisioning": true,
            "buildFlag": [
                "EMBEDDED_CONTENT_CONTAINS_SWIFT = YES",
                "ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES=NO",
                "LD_RUNPATH_SEARCH_PATHS = \"@executable_path/Frameworks\""
            ]
        },
        "release": {
            "codeSignIdentity": "iPhone Developer",
            "developmentTeam": "FG35JLLMXX4A",
            "packageType": "app-store",
            "automaticProvisioning": true,
            "buildFlag": [
                "EMBEDDED_CONTENT_CONTAINS_SWIFT = YES",
                "ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES=NO",
                "LD_RUNPATH_SEARCH_PATHS = \"@executable_path/Frameworks\""
            ]
        }
    }
}

您可以在上面提到的链接中阅读更多内容。

您现在可以使用以下方法构建应用程序:

phonegap build ios (if filename is build.json)
phonegap build ios --buildConfig path/xyz.json (if filename is other than build.json)

cd platforms/ios
xcodebuild archive -workspace app.xcworkspace -scheme scheme-name -configuration Release -archivePath IPA-name.xcarchive
xcodebuild -exportArchive -archivePath IPA-name.xcarchive -exportPath IPA-name.ipa -exportOptionsPlist exportOptions.plist

答案 3 :(得分:-1)

我能够通过在xcodebuild命令中使用CONFIGURATION_BUILD_DIR参数并指定空的构建目录来从命令行构建。似乎由XCode构建的文件与xcodebuild命令冲突