[英]How to add a private CocoaPod as a dependency in another pod .podspec file?
[英]How to create a Ruby string within a CocoaPod PodSpec?
在pod规范中重用字符串有一个常见的技巧:
s.version = '0.0.2'
s.source = { :git => ..., :tag => s.version }
通过在分配之后重用s.version字符串,我不必记得在更新podspec
时更改两个字段。
但是,我真正想做的是用“v0.0.2”标记我的代码,而不是“0.0.2”。 所以我尝试通过在版本前加上'v'来创建一个新字符串:
s.source = { :git => ..., :tag => 'v' + s.version }
但是,这会轰炸pod
命令。
我记得在不久前寻找其他东西的时候看到了一个技巧,它展示了如何将Ruby代码注入到规范中,但我现在找不到它,即使我不能确定它解决了我正在尝试做的事情。
所以,我的问题是,这是否可能,如果是这样,我该如何实现呢?
您缺少.to_s
电话。 我创建了一个示例podspec来重现您的问题。 的确,:
s.source = { :git => ..., :tag => 'v' + s.version }
没有通过lint
传递验证,我有很多错误。 但是,我添加了to_s
调用,它对我v1.0.0
, lint
开始获取我的v1.0.0
标记。
s.source = { :git => ..., :tag => 'v' + s.version.to_s }
希望能帮助到你。
首先,我想提供一个替代答案。 而不是使用Ruby字符串连接
'v' + s.version.to_s
你也可以使用Ruby字符串插值,这是大多数人在这种情况下会使用的
"v#{s.version}"
在Ruby #{...}
中就像shell脚本或Perl中的${...}
一样,整个表达式被代码片段( ...
)的输出所取代,它可以是一个变量,一个方法调用或任何其他代码。 但这仅适用于双引号(再次,就像在shell脚本或Perl中一样)。
现在关于OP @DavidH回复@RaffAl答案的评论:
我根本不认识Ruby。 s.version是一个字符串,但我必须把它变成一个字符串来创建一个新的字符串(看看为什么我会晕眩!)。
Ruby是一种极其动态的语言,其中一切都是对象,几乎所有东西都是作为一种方法实现的,甚至是大多数运算符。 例如a = b + c
实际上使用参数c
在b
上调用方法+
(是的,这是Ruby中的有效方法名称),因此它实际上与a = b.+(c)
。
当你写作
s.version = '0.0.2'
它看起来好像只是为变量赋值,但事实上发生的是调用setter方法,因为这段代码与下面的代码相同:
s.version=('0.0.2')
是的,该方法实际上命名为version=
(Ruby中的方法名称允许使用某些运算符)。 在Java中,该方法很可能被命名为setVersion()
。 仅仅因为你将字符串传递给setter并不意味着这个字符串也存储在任何地方。
当你打电话的时候
x = s.version
你实际上是在调用getter方法:
x = s.version()
在Java中,此方法将命名为getVersion()
。 并且此getter不返回字符串,它返回Version
对象。 所以你的初始代码
'v' + s.version
事实上这样做:
'v'.+(s.version)
但问题是,类String
的+
方法不知道如何附加类Version
的对象,这就是它失败的原因。
所有Ruby类都必须从另一个类继承,如果不是,它们只是从Object
类继承而且这个类定义了一个方法to_s()
,所以任何Ruby对象都知道to_s
(括号在Ruby中总是可选的, puts("Hello World")
与puts "Hello World"
相同。 如果它们不覆盖它,它会打印类名和对象ID的编码,但是很多类已经重写了这个方法以返回更有意义的东西。 Version
类将字符串作为字符串返回。
好的,但为什么字符串插值工作呢? 因为除非#{...}
中的表达式的结果产生一个字符串,否则Ruby会在该结果上调用to_s
来获得一个,这就是原因。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.