Tag: bash

跟踪Swift编译时间

通常,您需要向财务部门证明如何为您提供新的笔记本电脑会提高生产率。 使用此脚本,您可以确切地向他们显示等待Xcode花费时间的时间。 #!/bin/bash 让我们开始一个新的BASH脚本。 在脚本的整个生命周期中,它应大约运行swiftc (Swift编译器)运行的时间,并应与Xcode项目完全脱钩。 当我们在这里时,让我们获得其他一些有趣的统计信息,例如最长的构建时间和我们编译代码的次数。 首先,我们需要声明我们的变量。 让我们在脚本顶部编写该代码,以便在需要时可以轻松地对其进行编辑: INTERVAL = 5#采样率,以秒为单位 COMPILE_TIME = 0#总编译时间 ALL_TIMES =()#所有编译时间的数组 PREV_TIME = 0#临时存储 在这个阶段,我正在想象该脚本没有自然的退出点-它会一直运行,直到您从终端用^C (control + c)杀死它为止。 我们应该截获(也就是“捕获”)此中断信号,处理我们收集的数据,打印它,然后退出脚本: #当用户键入^ C时, #运行函数ctrl_c而不是退出 陷阱ctrl_c INT 函数ctrl_c(){ #找到最长的构建时间 最大= 0 对于$ {ALL_TIMES [@]}中的v; 做 如果(($ v> $ max)); 然后max = $ v; fi; 完成 #很好地格式化我们的数据 TIME_SPENT_S = $(日期-u -r $ max […]

快速运行Shell进程

每当我想进行一些快速脚本编写(例如创建大量随机测试用例以测试某些python程序)时, perl通常是我选择的语言。 当然,几天后很难理解,但是对于快速又脏的东西,它的工作非常出色。 主要优点之一是,从perl运行shell命令非常简单:您只需在反斜杠中写一些东西: `echo“ foo”` 例如,这使我很容易在计算出要使用的测试输入后调用适当的python脚本,然后在过程完成后验证输出。 为了将脚本编写过程切换到Swift,我想知道是否有可能这样做。 事实证明,在Foundation中有一个名为Process的类可以做到这一点。 但是,像大多数基础课程一样,它非常灵活,这也意味着有很多样板要进行。 这是我尝试将其转换为简单的函数调用。 首先,我在Google上搜索了一些使用Process类的代码片段,这样我就可以获得一种初步的方法。 事实证明,我还需要使用Pipe类来捕获输出。 真正困扰我的是,我正在尝试测试的程序需要从stdin读取其输入。 我想给它提供一个普通的字符串(而不是编写它来读取一个文件,这似乎太麻烦了),但是我找不到用Pipe做到这一点的方法-官方文档使我在其他方面进展顺利但这使我失败了。 然后,解决方案:将输入内容写入临时文件,使用该文件作为输入来运行该过程,然后删除该文件。 笨拙,有点太笨拙了,但是我知道了。 考虑到我以为刚开始时这甚至是不可能的,因此产生的功能出奇地好。 我只是用它们来创建一些测试功能并成功地对一些作业进行评分。 最终代码在下面的要点中:

在使用git flow和持续集成的同时确保唯一的内部版本号

在iOS世界中,您希望保持内部版本号唯一(CFBundleVersion)。 将应用程序提交到appStore时,Apple将检查您之前是否尚未提交具有相同编号的版本。 内部版本号也必须大于您以前的内部版本号。 否则,苹果将拒绝它。 那么,当使用git分支模型时,如何保持该数字不变? 您显然可以手动跟踪内部版本号并自己增加,但是我觉得这很麻烦。 您可以编写一个脚本,该脚本每次在xCode中构建时都会破坏您的内部版本号,但是根据我的经验,当您有多个开发人员在各自的分支上构建不同的发行版时,这些脚本就开始崩溃。 因此,今天我将带您完成一个将内部版本号保存在中央位置的过程,以便在创建新内部版本时始终可以确保内部版本号是唯一的。 首先,您需要选择哪个分支将保留事实。 在这个例子中,我将使用develop。 创建新版本时,第一个任务是检查最新版本号并增加它。 # the truth for the current bundle version is on develop, switch branch and get the number # but first save the branch we are currently on to be able to come back BUILD_GIT_BRANCH=$(git rev-parse –abbrev-ref HEAD) # switch branch git checkout develop # […]

Bash脚本在HTML中的快照(iOSSnapshotTestCase + Bash + HTML / CSS)

辛北尔(Siempre)和布宜诺斯艾利斯(Bueno automatizar)。 是的,您可以在任何时候都可以轻松地找到自己的名字。 请在iOS原始版本的HTML中添加HTML格式的快照。 从iOS快照测试案例中获取消息。 Tener un proyecto iOS和iOSSnapshotTestCase集成在一起。 Escribíunartículosobre como usarlo,信息通报。 Tener conocimientosmínimosde Bash脚本编写 Descargando el proyecto de ejemplo 可以通过整体快照来复制和保存快照。 Para ello hacemos: git clone https://github.com/fedejordan/SnapshotsHTMLExample Podemos ver que los pods ya estan descargados(des subi al proyecto para descargarlosmásrápido)和ademoástenemos algunos快照generados para los siguientes设备:iPhone SE,iPhone 8,iPhone 8 Plus,iPhone XR和iPhone XS和iPhone XS Max。 Algo para recordar,para […]

在Swift中解码ASN.1 DER序列

我正在使用的API返回使用椭圆曲线数字签名算法(ECDSA)签名的敏感数据。 签名本身是一个ASN.1 DER序列-因为我在网上找不到Swift或Objective-C DER解析器,所以我需要自己编写。 ECDSA签名可以分为两个整数。 我们可以使用openssl检查此整数。 $ echo -en“ 3045022100a85e76ff1f18e52d4eccde774aa46e3ec2891068ebef89a7cb6e0653eb0dffb202204cd76e19bcb18d76c13af0ea061117cbd6d3c8fbd1d9fc9aac265266371c3a3f” xxd -pu -r>签名 $ openssl asn1parse-通知der-输入签名 。 0:d = 0。 hl = 2 l =。 69弊:SEQUENCE。 。 2:d = 1。 hl = 2 l =。 33 prim:整数。 :A85E76FF1F18E52D4ECCDE774AA46E3EC2891068EBEF89A7CB6E0653EB0DFFB2 。 37:d = 1。 hl = 2 l =。 32素数:整数。 :4CD76E19BCB18D76C13AF0EA061117CBD6D3C8FBD1D9FC9AAC265266371C3A3F 如您所见,这两个整数在签名的十六进制编码版本中可见,但是我们如何使用Swift将它们取出呢? 维基百科上有一些DER编码数据的很好的例子。 事实证明,整个十六进制字符串都位于类型-长度-值三元组中。 这意味着数据所保存的每个可变长度值都以其类型和长度为开头,每个值都为1个字节。 我发现此页面描述了ASN1解码器应该期望的类型标签。 让我们将其表示为一个enum […]

Xcode构建阶段和环境

如何教Xcode尊重环境。 如果您曾经做过iOS开发,那么您肯定会使用Xcode Build Phases。 构建阶段可以执行的任务之一就是运行Shell脚本,这是您可能会遇到的一个特殊问题…… 问题在于,在Xcode构建阶段中运行的Shell脚本无法获取用户Shell配置文件。 尝试将以下内容放入您的外壳配置文件中: Shell配置文件中的任何消息都不会显示。 原因是从Xcode构建阶段运行的外壳是非交互式外壳。 它实际上不是错误,而是预期的行为,但这可能会使您感到困惑。 这个例子 举例来说,假设您有一个要在Xcode构建阶段中运行的Ruby脚本。 该脚本恰好使用了2.5.x Ruby语言功能,而这些功能在2.3.x中不可用。 您还使用RVM来安装和使用版本2.5.x。 现在,将ruby –version添加到构建阶段,构建项目并检查输出。 在Mojave OS X上,输出为2.3.7 ,这是系统Ruby版本。 通常在外壳程序配置文件中定义的RVM环境都没有加载到脚本中。 解决此问题的一种方法是使用登录外壳程序。 就像在构建阶段的“ Shell”参数中添加-l一样简单,例如/bin/sh -l 。 但是,它不适用于Bourne shell(sh)。 但随后它将适用于再次使用Bourne的shell(bash),因此您可以将“ Shell”参数更改为/bin/bash -l 。 您现在将在日志中看到以下内容: 加载〜/ .bash_profile 那行得通,但并不理想。 如果团队中有很多开发人员,他们的~/.bash_profile可能会发生各种各样的事情,而您不一定要在Xcode构建阶段中运行它们。 您只需要加载RVM环境,别无其他。 其他开发人员也可以使用zsh或其他类型的shell。 构建阶段脚本 解决此问题的另一种方法是仅在每个构建阶段脚本中提供重要的内容。 例如,要使用RVM在非交互式shell中加载Ruby版本,可以使用以下代码: 尽管此方法可能需要更多工作,但由于以下几个原因,它仍然是更好的方法: 您只加载运行脚本所需的内容,而不加载用户的shell配置文件中的所有内容 根据项目的.ruby-version文件选择Ruby版本,而采用登录Shell方法时,将加载为RVM全局设置的默认Ruby版本,并且您必须运行额外的代码才能切换到正确的版本 提示 有关使用Shell脚本构建阶段的一些技巧。 脚本错误 如果shell脚本返回的错误代码不是0 ,例如/bin/sh -e ,则构建阶段的Add -e标志将失败。 管理构建阶段脚本 […]

以期待的方式通过SCP更新IOS

美好的一天。 我试图创build/运行一个脚本,这将允许我从服务器发送更新的IOS到我的networking设备。 当我在“:flash”命令之前input一个手动IP地址时,下面的代码工作。 #!/user/bin/expect set IOSroot "/xxxxx/xxx/c3750e-universalk9-mz.150-2.SE10a.bin" set pw xxxxxxxxxxxxxxxxxxx spawn scp $IOSroot 1.1.1.1:flash:/c3750e-universalk9-mz.150-2.SE10a.bin expect "TACACS Password:" send "$pw\r" interact 那里的代码很好,正如预期的那样。 当我尝试使用名为“ioshost”的IP列表的文件并在该脚本中使用该文件来获得一些自动化时,会出现问题。 我已经尝试了各种各样的事情来得到这个工作。 其中一些如下: 设置variables IPHosts=$(cat ioshost) set IPHost 'cat ioshost' 随着试图使用读/做命令… while read line; do spawn scp $IOSroot $line:flash:/c3750e-universalk9-mz.150-2.SE10a.bin done < ioshost 这些似乎都没有工作,我正在寻找指导。 请注意,我明白,设置密码不是最好的做法,但设置其他文章中提到的RSA密钥是不允许的,所以我被迫这样做。 感谢您的时间。

通过terminal批量构build和存档iOS应用程序

我正在尝试简化iOS应用发布的构build – >归档 – >提交过程。 我们有超过50个移动应用具有几乎相同的框架,但具有不同的graphics和configuration设置。 我通常会在xcode 4.2中加载每个项目,然后使用xcode GUI来构build – >归档 – >提交通常的方式,但是现在我们已经有超过50个应用程序,而且这个过程在我们推出更新的时候非常麻烦。 这就是说,我正在尝试使用shell函数来加速这个过程。 我做了大量的研究,发现xcodebuild (见里德的答案)应该工作,但是档案选项不工作,因为我得到以下错误: unsupported build action 'archive' 所以我写了以下内容: # $1 should be a date like: 2012-07-17 # $2 should be a time like: 10.31AM # $mybase will be the current directory at the time the function was called # so make sure […]

sed:用换行符在特定模式之后插入行

我们想修改一个plist文件,在匹配一个模式之后,它应该使用sed shell命令插入几行。 plist文件格式如下: <plist> <dict> . . <key>abc</key> <dict> . . </dict> . . </dict> </plist> 我们想要在find第一个字典标记后插入几行。 如果我使用follow命令,它插入文件中的所有字典标记。 sed -i '' "/<dict>/ r template" info.plist 所以,我试图findplist和dict标签,然后插入行。 sed -i '' "/<plist version=\"1.0\">\n<dict>/r template" info.plist 要么 sed -i '' "/\(^<plist version=*.\)/ r template" info.plist 这也不起作用,它无法find文件中的模式。 请build议我怎样才能把一个模式,其中包含由换行符分隔的两个string。