なんか1回ずつFastlaneでgymしてdeliverしてーはできるが、2個以上連続してビルドするとエラーになる。
条件/環境
- Fastlane 2.28.9.
- plist 3.3.0
- xcodeproj (>= 1.4.4, < 2.0.0)
- CFPropertyList (~> 2.3.3)
- ruby 2.3.3p222 (2016-11-21 revision 56859) [x86_64-darwin16]
現象
- 発生しだしたのは4月末頃から。
- Fastlaneとpatsplat/plistを使うと、ひょんなときにplistがバイナリ形式で出力され、patsplat/plistでエラーがでる。
- そのため、1度目のビルドは通るが、2度目にInfo.plistを変更した後のビルドは通らない。(謎)
- patsplat/plist が
invalid byte sequence in UTF-8
というexceptionを投げてくる。
- patsplat/plist が
修正方法
plist と CFPropertyListを共存させてはならぬ。1 2
patsplat/plist 使わず、ckruse/CFPropertyList を使って実装することを提案します ( ´・‿・`)
一時的な回避。作業用lane.
現象にあげるexceptionが発生したときにする作業用lane.(Proj
は任意のプロジェクト名)
治るものじゃないけど、取り敢えず3つビルドしたいんだ!というときに使った。
lane :reset_plist do
UI.message "Your working folder: " + `pwd`
`git checkout HEAD -- ../Proj/Info.plist`
`git checkout HEAD -- ../Proj`
`git checkout HEAD -- ../ProjTests/Info.plist`
`git checkout HEAD -- ../ProjUITests/Info.plist`
`rm ../Proj/Info.plist.new1`
end
呼び出し:$ fastlane reset_plist
根本的な原因
前提として、
- FastlaneはCocoapods/Xcodeprojを使っている。
- patsplat/plist はバイナリ形式plistには対応していない
- Cocoapods/Xcodeprojはバイナリ形式plistには対応している。(ckruse/CFPropertyListを使うことにより対応している。)
そのためバイナリ形式に変換されたInfo.plistはpatsplat/plistは扱うことができない。
そして、 patsplat/plist
内の実装抜粋はこちら:
# Helper method for injecting into classes. Calls <tt>Plist::Emit.dump</tt> with +self+.
def to_plist(envelope = true)
d = Plist::Emit.dump(self, envelope)
return d
end
class Hash #:nodoc:
include Plist::Emit
end
次に、 ckruse/CFPropertyList
内の実装抜粋はこちら:
class Hash
# convert a hash to plist format
def to_plist(options={})
options[:plist_format] ||= CFPropertyList::List::FORMAT_BINARY
plist = CFPropertyList::List.new
plist.value = CFPropertyList.guess(self, options)
plist.to_str(options[:plist_format], options)
end
以上のことにより、plist と CFPropertyListを使っている場合は予期せず違うやつを呼び出してしまう事がある。悲しい。
-
使い方によっては不具合があることについては既に半年以上前にFastlane側のIssueやCocoaPods/Xcodeprojで認識されているが議論はほぼ全く進んではいない。個人的にはFastlane側で対策する問題ではなく、Cocoapods/Xcodeprojが対策すべきーと思うが、そもそも論として、各ライブラリはそれぞれが不具合無く存在している以上、共存させて使ってバグを出している側がイケないので僕たち使う側が治すべきだと思う。またplistもCFPropertylistも古参のライブラリでもあるため治るまで時間が掛かるのではないかという点もある。そもそも半年も治ってない時点で治るまでの時間がかかるのは察せマス。 ↩
-
てか、なんでこのタイミングでバグふんだんだろ。FastlaneのIssue見る限り年末には発覚してないと変 ↩