Podfile中涉及的Ruby基本语法

背景

最近在适配 XCode11.3时经常需要改Podfile,但是仅仅停留在依样画葫芦的阶段,只知道形式,不知道为什么要这么写,于是简单研究一下 Podfile 涉及的语法。

Podfile 的本质是什么

Podfile 其实是简写的 Ruby 代码,Cocoapods从Podfile读取数据,然后使用 eval 直接将文件中的内容当做 Ruby 代码来执行,安装对应的三方库和一些配置的操作

Podfile

在这用我们工程中的 Podfile 举例,解释一下具体内容

project 'jayanzi.xcodeproj'
platform :ios, '9.3'
inhibit_all_warnings!

post_install do |installer|
    # 需要指定编译版本的第三方的名称
    myTargets = ['RxASDataSources']
    
    installer.pods_project.targets.each do |target|
        if myTargets.include? target.name
            target.build_configurations.each do |config|
                config.build_settings['SWIFT_VERSION'] = '4.0'
            end
        end
    end
end

# Pod 私有库
source 'https://github.com/Eaffy/react-native-specs.git'

target ‘jayanzi' do
    # Comment the next line if you're not using Swift and don't want to use dynamic frameworks
    use_frameworks!
 
    pod 'Then'
    pod 'UMCCommon', '~> 2.1.1'
    pod 'UMCSecurityPlugins'
    pod 'UMCAnalytics'
    pod 'RNReanimated', :git => 'https://github.com/software-mansion/react-native-reanimated.git'

    target 'jayanziTests' do
        inherit! :search_paths
        # Pods for testing
    end
    
    target ‘jayanziUITests' do
        inherit! :search_paths
        # Pods for testing
    end
end

Ruby 语法

在开始解析前,先介绍几个必备的 Ruby 语法

  1. 井号#后表示注释
  2. 数据类型
Number: 239   
String: "apple"
Bool: true  false
Symbols: :name #(包含前边的:)可以简单理解成不变的字符串
Hash: {:name => “JaYanZi”} #字典
Array: [1, 2, 3] #元素可以不同类型 [1, “two”, :three, {:name => 4 }]
  1. 赋值不需要类型声明
name = "JaYanZi"
  1. 命名规范
    常量: 全部大写 CONST_VAR
    变量: 小写字母 apple
    class module: 首字母大写 驼峰
    方法名:小写字母开头,可以移? = !结尾
  2. 变量
    类变量 @@name
    实例变量 @name
    普通变量 name
    全局变量 $name
  3. 字符串插值
    “hi, #{name}”
  4. 条件语句
if conditional  [then]
   code
elsif conditional [then]# 比 elseif 少个 e
   code 
else
   code
end
case expr0
when expr1, expr2 [then]
    code
when expr3 [then]
    code
else
    code
end
  1. 方法
class Apple
# 类方法
    def Apple.name
        “apple”
    end
# 实例方法
    def color
        “red”
    end
end
  1. Ruby 的简写
    i. 方法调用的最外层可以省略
    ii. 函数的最后一行代码默认是返回值
    iii. Hash最外层的{}可以省略(如果是最后一个参数,除去 block)

    iV. block 简写
    Apples.all.map { |apple| apple.name }
    等价于
    Apples.all.map{ &:name }
  2. 双冒号:: 表示 class 的常量或命名空间
class Fruit
    class Apple
        COLOR = ‘red’
    end
end

Apple::COLOR
Fruit::Apple
  1. do end 基本上等于{}

示例代码解析

project

project 'jayanzi.xcodeproj'
Ruby 中方法调用可以省略小括号,这行代码实际上是一个函数调用,相当于
project('jayanzi.xcodeproj')
翻查源码,project 这个函数定义在 dsl.rb 中。

def project(path, build_configurations = {})  
    current_target_definition.user_project_path = path
    current_target_definition.build_configurations = build_configurations
end

同样的
platform :ios, '9.3'调用platform(name, target = nil),:ios 是一个 Symbols 类型的参数
inhibit_all_warnings!调用inhibit_all_warnings!,其中!是函数名的一部分,调用省去了小括号
source 'https://github.com/Eaffy/react-native-specs.git'调用source(source),source 类型为[String]

post_install

post_install do |installer|
    # 需要指定编译版本的第三方的名称
    myTargets = ['RxASDataSources']
    
    installer.pods_project.targets.each do |target|
        if myTargets.include? target.name
            target.build_configurations.each do |config|
                config.build_settings['SWIFT_VERSION'] = '4.0'
            end
        end
    end
end

同样是调用了函数

def post_install(&block)
    raise Informative, 'Specifying multiple `post_install` hooks is unsupported.' if @post_install_callback
    @post_install_callback = block
end

该函数允许你用代码修改生成 Xcode,block 会回调一个Pod::Installer,也就是使用中的installer。

target

target ‘jayanzi' do
    ...
end

调用了def target(name, options = nil),name的值为'jayanzi',option为默认值,do...end 相当于{},do...end 中间的为 block,该函数通过block_given?获得 block,执行其中的代码。

pod

pod 'Then'
pod 'UMCCommon', '~> 2.1.1'
pod 'RNReanimated', :git => 'https://github.com/software-mansion/react-native-reanimated.git'

调用def pod(name = nil, *requirements),第一个参数是依赖的名,Ruby 中,假如最后一个参数,名字前面带星号 *,就表示可以传递不定参数。个数也可以不定。
pod 'RNReanimated', :git => 'https://github.com/software-mansion/react-native-reanimated.git'第二个参数实际上是一个 hash,由于是最后一个参数,可以省略{},完整的应该为
pod('RNReanimated', {:git => 'https://github.com/software-mansion/react-native-reanimated.git'})

参考文章

Ruby语言快速入门
Podfile、DSL 和 Ruby 语法
CocoaPods 都做了什么?
Ruby 教程

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,843评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,538评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,187评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,264评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,289评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,231评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,116评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,945评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,367评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,581评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,754评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,458评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,068评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,692评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,842评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,797评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,654评论 2 354

推荐阅读更多精彩内容