MeetYouDevs / cocoapods-imy-bin

1.05k stars 244 forks source link

制作framework时,资源丢失,好像发现了bug,定位到了代码位置,麻烦作者关注一下 #194

Closed buyu03 closed 2 years ago

buyu03 commented 2 years ago

制作完成framework后,发现资源丢了,在组件库中,资源的关联方式如下:

s.resource_bundles = {
    'MKPFDataModule' => ['MKPFDataModule/Resource/**/*.{xcdatamodeld}']
  }

另外,补充一个问题,通过gem安装的 cocoapods-imy-bin,能够正常制作二进制framework,但将代码拉到本地,通过gem编译安装后,制作二进制报:fatal error: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/lipo: can't open input file: build-arm64/libMKPFDataModule.a (No such file or directory)

buyu03 commented 2 years ago

关于上面 fatal error: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/lipo: can't open input file: build-arm64/libMKPFDataModule.a (No such file or directory) 的问题,搞清楚了,是因为从 GitHub上下载的tag上的代码,不是最新代码,是的,你没听错,就是不是最新代码,是真刺激,别问我是怎么知道的,差点EMO

buyu03 commented 2 years ago

然后不断的找源码,在framework_builder.rb 文件中,我好像发现了什么秘密,制作 framework 的时候,先执行到这里:

UI.section("Building framework  #{@spec}") do
              # defines = compile

              # build_sim_libraries(defines)
              output = framework.fwk_path + Pathname.new(@spec.name)

              copy_static_framework_dir_for_ios

              build_static_framework_machO_for_ios(output)
              # copy_license
              copy_framework_resources
              #cp_to_source_dir#

            # rescue Object => exception
            #   UI.puts exception
            # end
          end

然后我们看看 copy_framework_resources 方法:

def copy_framework_resources
        resources = Dir.glob("#{framework.fwk_path + Pathname.new('Resources')}/*")
        if resources.count == 0
          framework.delete_resources
        end
      end

我不懂 ruby,但是,社会的毒打告诉我,这里好像不太对劲,不是copy resource吗,只是读取了一下 framework 下 Resources 文件夹里的东西,也没见往里放东西啊,这不是删了个寂寞吗?同时对比了一下另外一个方法 copy_resources,感觉 copy_resources 要正经一点,只是吧,这个方法是 为 Building static Library 准备的。

感觉我发现了惊天的秘密,可是,天杀的我不会 ruby。美柚的大佬们,能确认一下我发现的信息吗,万一被我碰到死耗子了呢,不然这业务库做不来 framework,KPI 就唧唧了。

已经准备了星爸爸给大佬们奉上,麻烦尽快确认一下,万分感谢了!

buyu03 commented 2 years ago

恶补ruby,自行解决,原因就是,没有把resource_bundle放到framework下面去,导致 resource_bundle丢失,参考 copy_resources 方法修改 copy_framework_resources 即可,简单点做法,就是通过 spec 中的 resource_bundle 字段找到对应的bundle,放到 framework 的 Resources 文件夹下,当然了,中间还有对比、去重、判空等等操作,不做赘述。结局就是,自行发现,自行解决。最终,还是要感谢美柚,提供了很好用的双私有源二进制方案。