LoginSignup
1

More than 5 years have passed since last update.

Fastlaneとpatsplat/plistを使っている時にバイナリ形式plistが出力されるときの原因と対策

Last updated at Posted at 2017-05-10

なんか1回ずつFastlaneでgymしてdeliverしてーはできるが、2個以上連続してビルドするとエラーになる。

条件/環境

現象

  • 発生しだしたのは4月末頃から。
  • Fastlaneとpatsplat/plistを使うと、ひょんなときにplistがバイナリ形式で出力され、patsplat/plistでエラーがでる。
  • そのため、1度目のビルドは通るが、2度目にInfo.plistを変更した後のビルドは通らない。(謎)
    • patsplat/plist が invalid byte sequence in UTF-8 というexceptionを投げてくる。

修正方法

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を使っている場合は予期せず違うやつを呼び出してしまう事がある。悲しい。


  1. 使い方によっては不具合があることについては既に半年以上前にFastlane側のIssueやCocoaPods/Xcodeprojで認識されているが議論はほぼ全く進んではいない。個人的にはFastlane側で対策する問題ではなく、Cocoapods/Xcodeprojが対策すべきーと思うが、そもそも論として、各ライブラリはそれぞれが不具合無く存在している以上、共存させて使ってバグを出している側がイケないので僕たち使う側が治すべきだと思う。またplistもCFPropertylistも古参のライブラリでもあるため治るまで時間が掛かるのではないかという点もある。そもそも半年も治ってない時点で治るまでの時間がかかるのは察せマス。 

  2. てか、なんでこのタイミングでバグふんだんだろ。FastlaneのIssue見る限り年末には発覚してないと変 

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1