Ios xcodebuild不会编译该项目,除非它至少使用Xcode为cocoapods集成项目打开一次

Ios xcodebuild不会编译该项目,除非它至少使用Xcode为cocoapods集成项目打开一次,ios,xcode,shell,jenkins,xcodebuild,Ios,Xcode,Shell,Jenkins,Xcodebuild,我有一个关于可可豆的项目 下面是我用来构建项目的命令 /usr/bin/xcodebuild-scheme-Jenkins-workspace /Users/Shared/Jenkins/Documents/Jenkins/Jenkins2/Jenkins.xcworkspace -配置发布清洁构建配置构建目录=/Users/Shared/Jenkins/Documents/JenkinsTestNuu/app 'CODE\u SIGN\u IDENTITY=iPhone发行版:XXXX yay

我有一个关于可可豆的项目

下面是我用来构建项目的命令

/usr/bin/xcodebuild-scheme-Jenkins-workspace /Users/Shared/Jenkins/Documents/Jenkins/Jenkins2/Jenkins.xcworkspace -配置发布清洁构建配置构建目录=/Users/Shared/Jenkins/Documents/JenkinsTestNuu/app 'CODE\u SIGN\u IDENTITY=iPhone发行版:XXXX yay(3G5FKTZJ2K)' 产品捆绑标识=com.XXXX.two 供应-配置文件=6e6506e9-8233-4886-9084-ce21e8f8bbae

以上脚本只有在项目至少使用Xcode打开一次后才能正常工作,Xcode可以关闭,没有问题

如果项目尚未打开,那么如果我运行脚本 轮子在下面旋转,永远没有任何进展,例如下图

如果它只打开一次,而不是下面的纺车,文本将显示在下面

===使用配置发布清理项目POD的目标XWebView===

检查依赖项

干净,把它拿下来 /Users/Shared/Jenkins/Documents/JenkinsTestNuu/app/XWebView.framework.dSYM 内置rm-rf/Users/Shared/Jenkins/Documents/JenkinsTestNuu/app/XWebView.framework.dSYM

干净,把它拿下来 /Users/Shared/Jenkins/Library/Developer/Xcode/DerivedData/appanme bqjwbjqisegleaonpytprisnig/Build/Intermediates/Pods.Build/Release-iphoneos/XWebView.Build 内置rm-rf/Users/Shared/Jenkins/Library/Developer/Xcode/DerivedData/appanme bqjwbjqisegldeaonpytyprisnig/Build/Intermediates/Pods.Build/Release-iphoneos/XWebView.Build

干净,把它拿下来 /Users/Shared/Jenkins/Documents/JenkinsTestNuu/app/XWebView.framework 内置rm-rf/Users/Shared/Jenkins/Documents/JenkinsTestNuu/app/XWebView.framework

==使用配置发布清理项目POD的目标POD===

检查依赖项 等等

在任何非cocoapods项目中均未发现该问题


那么原因是什么以及如何解决呢?

在构建项目之前,您需要运行
pod安装程序
,以便在Jenkins工作区的
pod文件中指定cocoapod。

为什么会发生这种情况?

一个快速diffMerge工具,用于分析由Xcode打开的项目与迄今为止未由Xcode打开的相同项目之间的差异

从中我们可以看到,一旦Xcode在.xcodeproj中打开,就会创建许多与方案相关的文件

所以xcodebuild通过使用与方案相关的元数据创建.app,但由于没有针对其失败的方案来构建

如何解决这个问题?

由于缺少元数据,它无法构建,因此需要打开Xcode,以便文件由Xcode自动创建,因此将有一些方案可供构建

但是,当您打开Xcode时,会在xcuserdata下为特定用户创建与此方案相关的文件。i、 e每个用户都有自己的文件,用于保存打开的状态文件夹、上次打开的文件等

把这个文件保存在我们这里是不明智的

通过选中“管理方案”下的“共享”复选框,可以解决此问题

这会将方案从单个XUserData下移出到可通过源代码管理提交的共享文件夹中,您可以安全地忽略XUserData并将共享文件夹保留在源代码管理中

现在,即使只打开一次Xcode,我们也可以构建代码

品牌化 (用户界面、构建设置和功能)

  • 用户界面
    • 应用程序图标和其他图标
    • iTunes艺术品
  • 生成设置
    • 应用程序名称
    • 包标识符
    • 配置配置文件
    • 代码签名标识
  • 功能性
    • 特定于品牌的URL(登录、注销、获取资源等)
使用终端

Branding.sh

该文件是自描述性的,您可以轻松理解。 只需在文件中配置变量的值,并按如下方式调用它

sh Branding.sh
供参考:

如果您想更改应用程序图标和iTunesArtwork之外的其他图标 使用
cp
命令,例如

cp path/to/source path/to/destination
要了解更多信息,请执行
cp-man

通过上面的文件,您可以为UI和构建设置创建品牌

对于功能性品牌,您必须保持

  • 特定于品牌的URL

  • 与品牌相关的其他输入

在一个单独的plist文件中,这样在构建应用程序时,这些内容也可以根据各自的品牌进行更改

在编码端,您可以定制您的应用程序,以便像这样从plist读取值

功能定义:

在构建应用程序时,您可以使用PlistBuddy根据品牌更改密钥的值

下面是语法

/usr/libexec/PlistBuddy -c "Set :Key Value" plistfile.plist
使用Jenkins

我们可以在jenkins中有效地重用shell脚本

1.您必须在jenkins中使用添加参数对shell脚本中的所有变量进行参数化。。。在下面的屏幕截图中,我为一个变量做了这样的操作,你必须为所有其他变量做

2.在构建步骤中选择执行shell

3.复制基于配置创建构建开始和基于配置创建构建结束之间的脚本,并将其粘贴到Execute Shell中

注意:

  • 资源规则

    在某些版本中,当通过非Xcode接口构建和打包应用程序时,存在一个关于Xcode的ResourceRules的已知错误

    因此,必须运行一次才能停用xcode中资源规则路径的验证
    func getPlistFile()->Dictionary<String,AnyObject>? {
            var dictPlistFile:Dictionary<String,AnyObject>?
            if let path = NSBundle.mainBundle().pathForResource("plistfile", ofType: "plist") {
                if let dictValue = NSDictionary(contentsOfFile: path) as? Dictionary<String, AnyObject> {
                    dictPlistFile=dictValue
                }
            }
            return dictPlistFile
        }
    
    var Value=getPlistFile()?["Key"]
    
    /usr/libexec/PlistBuddy -c "Set :Key Value" plistfile.plist
    
    #!/bin/sh
    # A script to patch xcrun PackageInstallation so that it doesn't use the deprecated --resource-rules
    # See "Do not use the --resource-rules flag or ResourceRules.plist. They have been obsoleted and will be rejected."
    #   under https://developer.apple.com/library/mac/technotes/tn2206/_index.html#//apple_ref/doc/uid/DTS40007919-CH1-TNTAG205
    # Reported as Apple bug #19384243
    # 
    # should be run as a user who can modify the PackageApplication file
    
    xcodedir=$1
    
    function usage {
            # FIXME we cannot parse args properly because 2 are optional...
            echo "USAGE: $0 xcodedir"
            echo "  xcodedir: an install dir like /Application/Xcode6.1.1.app"
    }
    
    if [[ $# -ne 1 ]]; then
            echo "ERROR: invalid number of arguments"
            usage
            exit -1 
    fi
    
    pi="$xcodedir/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/PackageApplication"
    piorig="$piOrig"
    
    if [[ ! -f "$pi" ]]; then
        echo "$pi file not found. Invalid argument ?"
        usage
        exit -1
    fi
    
    grep resource-rules "$pi" 
    if [[ $? -ne 0 ]]; then
        echo "PackageApplication doesn't use resource-rules. Skipping"
        exit 0
    fi
    
    if [[ -f "$piorig" ]]; then
        echo "Backup file $piorig already exist. Aborting"
        exit -1
    fi
    
    perl  -p -i'Orig' -e 'BEGIN{undef $/;} s/,resource-rules(.*sign}).*ResourceRules.plist"/$1/smg' "$pi" 
    echo $?