tripleCC/cocoapods-bin

集成的Pod工程中没有Framework相关代码

Closed this issue · 31 comments

我现在按照文档进行一步一步的设置,pod install也成功了,pod bin list也能看到二进制的podspec。但是在install的工程中二进制组件只有目录,目录中没有最终的Framework的代码。这个可能是什么问题呢?

@edison0951 能贴下你的二进制 podspec 、podfile 么?你是在新建的 demo 工程里面用 ?

我弄了一个测试工程,下面这个是我用pod bin create生成的二进制podspec

{
  "name": "DZLoan",
  "version": "1.12.0",
  "summary": "业务组件",
  "description": "业务组件 framework",
  "license": "",
  "homepage": "http://coding.net/iOS/Loan_Pod",
  "authors": {
    "edison0951": "edison0951@gmail.com"
  },
  "platforms": {
    "ios": "8.0"
  },
  "source": {
    "http": "http://localhost:8000/framework/download/DZLoan/1.12.0.zip",
    "type": "zip"
  },
  "frameworks": [
    "UIKit",
    "Foundation",
    "Security",
    "SystemConfiguration",
    "CFNetwork",
    "QuartzCore",
    "CoreGraphics",
    "AddressBook"
  ],
  "compiler_flags": [
    "-ObjC",
    "-all_load",
    "$(inherited)"
  ],
  "resources": [
    "DZLoan.framework/Resources/*.{bundle}",
    "DZLoan.framework/Versions/A/Resources/*.{bundle}"
  ],
  "vendored_frameworks": "DZLoan.framework",
  "dependencies": {
    "IQKeyboardManager": [
      "~> 5.0"
    ],
    "SDWebImage": [
      "~> 4.3"
    ],
    "AFNetworking": [
      "~> 3.1"
    ],
    "Masonry": [
      "~> 1.0"
    ],
    "DZNEmptyDataSet": [
      "~> 1.8"
    ],
    "YYModel": [
      "~> 1.0"
    ],
    "SDCycleScrollView": [
      "~> 1.7"
    ]
  },
  "source_files": [
    "DZLoan.framework/Headers/*",
    "DZLoan.framework/Versions/A/Headers/*"
  ],
  "public_header_files": [
    "DZLoan.framework/Headers/*",
    "DZLoan.framework/Versions/A/Headers/*"
  ]
}

是不是我的resource的路径写的有问题?DZLoan.framework/Versions/A/Resources/*.{bundle}这个是pod lib自动生成的

二进制 podspec 没问题,可以 install 成功说明zip包没问题,如果你是用 pod bin repo push 发布的,那 podspec 里面的字段设置也没问题
cat ~/.cocoapods/bin.yml 和 cat Podfile 呢?

cat ~/.cocoapods/bin.yml

---
code_repo_url: git@coding.net:Team/DZSpecs.git
binary_repo_url: git@coding.net:Team/DZSpecs-binary.git
binary_download_url: http://localhost:8000/framework/download/%s/%s.zip
download_file_type: zip

但是Pods里面没有Framework内容,只是一个空的文件夹

cat Podfile

source 'git@coding.net:iOS/DZSpecs.git'
source 'https://github.com/cocoapods/specs.git'
inhibit_all_warnings!   #忽略所有警告
target 'Demo' do
  plugin 'cocoapods-bin'
  use_binaries!
      pod 'SSZipArchive', '~> 2.1.1.2'
      pod 'UIAlertView+Block', '~> 1.1.0'
      pod 'YYImage'
      pod 'YYImage/WebP'
      pod 'YYWebImage'
      pod 'DTCoreText', '1.6.21.6'
      pod 'DZLoan', '1.12.0'
end

@edison0951
现在暂时没想到原因,我也没有复现这个问题,
你可以先用这个例子跑下看 https://github.com/for-example-test/cocoapods-bin-example

二进制 podspec 没问题,可以 install 成功说明zip包没问题,如果你是用 pod bin repo push 发布的,那 podspec 里面的字段设置也没问题
cat ~/.cocoapods/bin.yml 和 cat Podfile 呢?
忘了说了,我不是用pod bin repo push的,我只直接把podsepc放入二进制的podspec仓库的,然后git提交上去的,和这个有关系吗?

最好确保 lint 通过

pod bin spec lint 这个不支持source参数吗?

spec lint 有问题,升级一个版本了
可以直接用 repo push
不过最好还是能把需要用到的库全部放在私有源里面,这样快

我的文件路径是:http://localhost:8000/framework/download/DZLoan/1.12.0.zip
yml里面写的是binary_download_url: http://localhost:8000/framework/download/%s/zip。
这样是对的吗?

我刚刚按你的demo改了下路径,
http://localhost:8000/framework/download/DZLoan/1.12.0/1.12.0.zip
bin.yml里面的路径是:binary_download_url: http://localhost:8000/framework/download/%s/%s/zip。
按这种方式,我的第一个二进制包下载下来了,但是里面的resource资源却没有,不知道是不是这个时候下载报错了,其他几个二进制包里面内容还是空的。

资源文件你去 Pods 下对应目录的 framework 看,里面有没有对应文件
如果本地 Pods 已经有对应的目录文件, 需要删除掉对应目录, cocoapods 才会重新去缓存或者远程拉

~/Library/Cache/Cocoapods里面这个对应的版本就是空的,所以感觉是不是pod bin在做zip下载的时候报错了,后面的就不执行了

bin 只做了切换 podspec 处理,缓存更新下载机制还是用的 cocoapods 的,也就是如果 zip 下载报错,那 install 就失败了。
运行 install 可以加 --verbose 看日志情况

我看了pod install --verbose日志
Http download
$ /usr/bin/curl -f -L -o /var/folders/fx/1prt3hbs5c16_l00x9k1cshm0000gn/T/d20190523-11551-1aoqxc1/file.zip
http://localhost:8000/framework/download/DZWallet/2.20.0/2.20.0.zip --create-dirs --netrc-optional --retry 2
也没看到下载失败,但是framework下啥也没有。我用的是mac自带的apache服务器

gem list cocoapods 输出看下?如果我给的 Demo 可以在你机器上正常运行,你清除下缓存再试你的工程看看。还有如果可以的话,你可以发个你说资源没有的 framwork zip 包给我看下?

我怎么发给你,你的demo工程是可以跑的

建个仓库,加我 member,到时候需要交流什么文件可以直接发到仓库里

好的

我刚刚又跑了下你的demo,发现你那下载日志是这样
/usr/bin/curl -f -L -o /var/folders/fx/1prt3hbs5c16_l00x9k1cshm0000gn/T/d20190524-38659-1evqmji/file.zip
http://localhost:8080/frameworks/OCHooking/0.1.1/zip --create-dirs --netrc-optional --retry 2
你那的压缩文件名字就叫zip?
还有个区别是我的所有压缩文件都包括的resource_bundles,压缩文件的名字都是用0.1.1之类的

我这的下载日志是这样的:
/usr/bin/curl -f -L -o /var/folders/fx/1prt3hbs5c16_l00x9k1cshm0000gn/T/d20190524-26371-kd52jo/file.zip
http://localhost:3000/framework/download/DZLoan/1.12.0/1.12.0.zip --create-dirs --netrc-optional --retry 2
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed

那个是 url ,实际的文件名是 OCHooking.framework.zip ,组件二进制文件保存目录层级和私有源一致,只不过里面不是 podspec,是 zip 文件

resource_bundles 资源经过打包后,最终会以 bundle 形式放在 framework 的 Resources 目录下,实际就变成了 resources 字段,也就是

 "resources": [
    "DZLoan.framework/Resources/*.{bundle}",
    "DZLoan.framework/Versions/A/Resources/*.{bundle}"
  ],

你可以先不加插件,直接自己写二进制 podspec 试试,就像 bugly 这些三方库一样,只是 source 改成 http ,加个 vendored_framework ,然后根据 url 去你自己的静态服务器下 zip 文件。如果在没有插件的情况下,install 的工程中对应的组件资源还是有问题,你要看下是不是 zip 包出问题了。

注意我的 zip 包解压之后就是 framework 文件,没有中间目录。

pod bin repo push 成功了么?

pod bin repo push没有成功,我先按你说的方式来试试

我试了下,应该是podspec和我们自己二进制包输出的方式不一样导致的。我换成我们自己的podspec,然后修改了source链接,改成http,就可以install成功

那压缩 framework 时,去除中间目录应该就可以了

主要还是podspec里面声明的结构有问题

如果你要自定义的 vendored_frameworks 路径,你需要自己创建 binary-template 文件
所以为了能够自动化处理,最好还是使用插件模版的路径, binary-template 更多的是给 subspec 用的

恩,还有个问题,现在用pod bin spec 生成的二进制podspec中,默认的resource和resource bundle都是在framework里面?

framework 就是二进制文件 + 资源 + 其他,本身就推荐在里面放资源,所以生成的 podspec 默认都指向里面的路径

了解