cocoapods-ybin 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '0956fbf69eeb9ae7c39bc7f954a4fbdeb3b30ce0ebb8cb16c8fdf9b7fe00e233'
4
- data.tar.gz: 8e43d906a2418b1f42bdc147312cbefa4ae4cb34e968d0db1f96f49cf2d83fbc
3
+ metadata.gz: e40278d03a980ab09c6e027ecc4b32f3d56fccf7263c4e32dda65c3665f2c8a3
4
+ data.tar.gz: 3cc644f8bfb358c543e7ab6cf1ab571fc522856e3c15185365d83ab73f7c9330
5
5
  SHA512:
6
- metadata.gz: 26e76f4cc63e0156a16ee35503906378cd04e3960bd0905ec2c594f975217ad749c691bd13c17761f5ccd6a0985a6dd8c1ec675e0b050a8dc27d550619d85750
7
- data.tar.gz: 6257cfdb02d6b936280258955596922d4923de54936cc0a5b0ba252643001d434d68e529b1661da0a2a3bf971c76a1c1fcd4ae3ea55c28422d0d1deaa289885e
6
+ metadata.gz: 5a4b1537ab50147be6a0e6df71f22260714b59619b46ffbc0980b9cf24aab53f98c1cdc32abe1d0e9d030da9fff669e1925d8ac21412edcfc54bcd19c629a5d2
7
+ data.tar.gz: 11a6ba2e42caef75685fbca58731eb85a5f3e26f7976c02bf6ac3b503cf077540130bb7a0d38c0d3d7ce1dfd944f460adf788fe56fbb31600f10cfe4c9293d28
data/README.md CHANGED
@@ -1,15 +1,110 @@
1
1
  [![Gem Version](https://badge.fury.io/rb/cocoapods-ybin.svg)](https://badge.fury.io/rb/cocoapods-ybin)
2
2
 
3
- # cocoapods-ybin
3
+ # 一、背景
4
4
 
5
- The binary library and source code mapping, to achieve breakpoints automatically jump into the corresponding source code for debugging the application.
5
+   随着项目业务的不断迭代和新增,每个业务线负责不同的功能模块,组件化势必是需要进行的工作。业界内,无论是哪种组件化方案,目的是一样的,分离业务和功能。
6
6
 
7
- ## Installation
7
+   组件化虽好,但是组件化只是将不同的业务分离或者不同的功能分离和分层,实际上还是在一个代码池里每次 **build** 需要进行编译、汇编、链接等过程。每次编译的占用的时间还是挺奢侈的,在编译速度上并没有提升。**pod install** 来回切换二进制和源码也更是一件可行不可取的开发模式。
8
8
 
9
- $ gem install cocoapods-ybin
9
+   **cocoapods-ybin** 解决二进制和源码之间的映射问题,无需来回切换源码,实现二进制断点可进入源码进行调试。实现原理是简单的,但区别于 **Android** 里的 **aar** 或 **jar** 内的 Class 文件。
10
10
 
11
- ## Usage
11
+ **cocoapods-ybin** 满足以下几个诉求考虑实现:
12
12
 
13
- $ pod ybin --help
13
+ - **小而好用、低成本接入**
14
+ - **与二进制库的制作和存储无关,只需二进制库和源码存储位置即可映射**
15
+ - **同时支持多项目并行开发**
16
+ - **只存储一份源码**
17
+ - **无需频繁的 clone 代码**
18
+
19
+ # 二、先睹为快
20
+
21
+ **cocoapods-ybin-demo** 示例效果视频,[示例代码地址](https://github.com/monetking/cocoapods-ybin-demo.git)
22
+
23
+ <video id="video" width="756" height="426" controls="" preload="none" poster="https://img.58cdn.com.cn/dist/rn/course/ybin_demo_cover.png">
24
+ <source id="mp4" src="https://img.58cdn.com.cn/dist/rn/course/ybin_demo_small.mp4" type="video/mp4">
25
+ </video>
26
+
27
+ # 三、安装
28
+
29
+ ## 3.1 直接安装
30
+
31
+ ```bash
32
+ $ sudo gem install cocoapods-ybin
33
+ ```
34
+
35
+ ![](https://tva1.sinaimg.cn/large/007S8ZIlly1gif1jwrswjj30v608owfm.jpg)
36
+
37
+ ## 3.2 使用 Gemfile 管理 pod 版本
38
+
39
+ 添加 **cocoapods-ybin** 到 Gemfile 文件
40
+
41
+ ```ruby
42
+ gem 'cocoapods-ybin'
43
+ ```
44
+
45
+ ## 3.3 安装校验
46
+
47
+ 执行命令 **pod --help** 查看当前 pod 版本 **ybin** 是否安装成功。
48
+
49
+ ```bash
50
+ $ pod --help
51
+ ```
52
+
53
+ ![](https://tva1.sinaimg.cn/large/007S8ZIlly1gif1oynpxyj312e0u07bm.jpg)
54
+
55
+ ![](https://tva1.sinaimg.cn/large/007S8ZIlly1gif1zrynuhj30s60f8gn8.jpg)
56
+
57
+ # 四、使用教程
58
+
59
+
60
+ 打开示例项目 **ocoapods-ybin-demo** [示例代码](https://github.com/monetking/cocoapods-ybin-demo.git) 的 Podfile 目录。示例项目使用了 **Bundler** 对 pod 的版本进行了控制,实际项目根据所需选择是否采用,与本插件无关联,请酌情选择。
61
+
62
+ ## 4.1 执行二进制和源码映射指令
63
+
64
+ ```bash
65
+ $ pod ybin link 二进制库名称
66
+ ```
67
+
68
+ ![](https://tva1.sinaimg.cn/large/007S8ZIlly1gif1sqf7erj317r0u044q.jpg)
69
+
70
+ ## 4.2 查看已映射列表
71
+
72
+ ```bash
73
+ $ pod ybin link --list
74
+ ```
75
+
76
+ ![](https://tva1.sinaimg.cn/large/007S8ZIlly1gif21izjaxj30xq09k0uh.jpg)
77
+
78
+ ## 4.3 删除某个或多个源码映射
79
+
80
+ ```bash
81
+ $ pod ybin link --remove 二进制库名称1 二进制库名称2
82
+ ```
83
+
84
+ ![](https://tva1.sinaimg.cn/large/007S8ZIlly1gif22c9z9gj313a0dewgy.jpg)
85
+
86
+ ## 4.4 删除所有源码映射
87
+
88
+ ```bash
89
+ $ pod ybin link --remove-all
90
+ ```
91
+
92
+ ![](https://tva1.sinaimg.cn/large/007S8ZIlly1gif23vf5mzj30xq0fadhy.jpg)
93
+
94
+ ## 4.5 查询项目使用 Pod 管理的版本
95
+
96
+ 查询项目通过Pod管理的组件库版本号,一般都是 cat Podfile.lock 文件,目视解析版本及依赖版本。阅读起来非常不友好,使用插件 **--lib-version** 扩展即可快速查看 Pod 管理的版本。
97
+
98
+ ```bash
99
+ $ pod ybin link --lib-version
100
+ ```
101
+
102
+ ![](https://tva1.sinaimg.cn/large/007S8ZIlly1gif25icgfjj30xq0cmtay.jpg)
103
+
104
+ # 五、期待
105
+
106
+ - 如果在使用过程中遇到Bug,希望您能Issues我,谢谢(或者尝试下载使用最新版本看看Bug修复没有)
107
+ - 如果在使用过程中发现功能不够用,希望你能Issues我,非常想为这个工具增加更多好用的功能,谢谢
108
+ - 如果你想为cocoapods-ybin输出代码,请拼命Pull Requests我
14
109
 
15
110
 
@@ -11,7 +11,7 @@ module Pod
11
11
  DESC
12
12
 
13
13
  self.arguments = [
14
- CLAide::Argument.new('NAME', false)
14
+ CLAide::Argument.new('LIB_NAME', false)
15
15
  ]
16
16
  def self.options
17
17
  [
@@ -74,11 +74,11 @@ module Pod
74
74
  def linkLibSource
75
75
 
76
76
  if @names.nil?
77
- UI.puts "[Error] 请输入需要映射的组件库. 示例: $ pod ybin foo\n".red
77
+ UI.puts "[Error] 请输入需要映射的组件库. 示例: $ pod ybin link foo\n".red
78
78
  return
79
79
  else
80
80
  if @names.count > 1
81
- UI.puts "[Error] 不支持一次映射多个源码. 示例: $ pod ybin foo\n".red
81
+ UI.puts "[Error] 不支持一次映射多个源码. 示例: $ pod ybin link foo\n".red
82
82
  return
83
83
  end
84
84
  end
@@ -101,8 +101,16 @@ module Pod
101
101
  config = config_with_asker
102
102
  lib_path = config["libPath"]
103
103
  sourcePath = config["sourcePath"]
104
+ lib_name = source_lib_name(lib_path)
105
+
106
+ lib_real_path = ""
107
+ if Pathname.new(lib_path).extname == ".framework"
108
+ lib_real_path = "#{lib_path}/#{lib_name}"
109
+ elsif Pathname.new(lib_path).extname == ".a"
110
+ lib_real_path = lib_path
111
+ end
104
112
 
105
- if lib_path == "" || !File.exist?(lib_path)
113
+ if lib_real_path == "" || !File.exist?(lib_real_path)
106
114
  UI.puts "\n[Error] 二进制文件不存在, 请检查文件位置!\n".red
107
115
  return
108
116
  end
@@ -112,23 +120,25 @@ module Pod
112
120
  return
113
121
  end
114
122
 
115
- lib_name = source_lib_name(lib_path)
116
- link_source_code(lib_path, sourcePath, lib_name)
123
+ link_source_code(lib_real_path, sourcePath, lib_name)
117
124
  end
118
125
 
119
126
  def link_source_code(lib_path, sourcePath, lib_name)
120
127
 
121
128
  comp_dir_path = `dwarfdump "#{lib_path}" | grep "AT_comp_dir" | head -1 | cut -d \\" -f2`
122
129
  if comp_dir_path == nil || comp_dir_path == ""
123
- UI.puts "\n[Error] #{lib_name} 不支持映射源码库\n".red
130
+ UI.puts "\n[Error] #{lib_name} 不支持映射源码\n".red
124
131
  return
125
132
  end
126
133
 
127
134
  lib_debug_path = comp_dir_path.chomp.strip
128
- if File.exist?(lib_debug_path) || File.directory?(lib_debug_path) || File.symlink?(lib_debug_path)
129
- print "源码文件: #{lib_debug_path} 已存在,无法源码映射,防止误删请检查:"
130
- UI.puts "\n1、源码已映射,无需重复映射 \n2、开发源码(无需映射,即可调试) \n3、其他重复文件, 请手动移动/移除\n".red
131
-
135
+ if File.exist?(lib_debug_path) || File.directory?(lib_debug_path)
136
+ if File.symlink?(lib_debug_path)
137
+ print "源码映射已存在, 无法重复映射,请删除后重新映射: #{lib_debug_path}"
138
+ else
139
+ print "源码映射目录已存在, 请检查 #{lib_debug_path} 目录(可能存在以下情况):"
140
+ UI.puts "\n1、开发源码(无需映射,即可调试) \n2、其他重复文件, 请手动移动/移除\n".red
141
+ end
132
142
  else
133
143
 
134
144
  begin
@@ -144,11 +154,7 @@ module Pod
144
154
  end
145
155
 
146
156
  FileUtils.rm_rf(lib_debug_path)
147
- if Pathname.new(lib_path).extname == ".a"
148
- `ln -s #{sourcePath} #{lib_debug_path}`
149
- else
150
- `ln -s #{sourcePath} #{lib_debug_path}/#{lib_name}`
151
- end
157
+ File.symlink(sourcePath, lib_debug_path)
152
158
  check_linked(lib_path, lib_debug_path, lib_name)
153
159
  end
154
160
  end
@@ -178,7 +184,7 @@ module Pod
178
184
  if lib_linked_path.nil? || lib_linked_path == ""
179
185
  UI.puts "[Error] #{name} 的映射不存在, 无需移除".red
180
186
  else
181
- if File.exist?(lib_linked_path)
187
+ if File.exist?(lib_linked_path) && File.symlink?(lib_linked_path)
182
188
  FileUtils.rm_rf(lib_linked_path)
183
189
  removeLinkedFileRecord(name)
184
190
  UI.puts "#{name} 成功移除".green
@@ -200,7 +206,7 @@ module Pod
200
206
  records.each.with_index(0) do |record, index|
201
207
  lib_linked_path = record["source_path"]
202
208
  lib_name = record["lib_name"]
203
- if File.exist?(lib_linked_path)
209
+ if File.exist?(lib_linked_path) && File.symlink?(lib_linked_path)
204
210
  FileUtils.rm_rf(lib_linked_path)
205
211
  removeLinkedFileRecord(lib_name)
206
212
  UI.puts "#{lib_name} removing...".green
@@ -208,7 +214,7 @@ module Pod
208
214
  end
209
215
  UI.puts "\n已全部移除\n".green
210
216
  else
211
- UI.puts "无记录\n".green
217
+ UI.puts "\n无记录\n".green
212
218
  end
213
219
  end
214
220
  end
@@ -220,13 +226,15 @@ module Pod
220
226
  records = JSON.parse(File.read(source_record_file_path))
221
227
  if records.count > 0
222
228
  records.each.with_index(1) do |record, index|
223
- UI.puts "#{index}. #{record["lib_name"]}(#{record["lib_version"]}) ".green "Source: #{record["source_path"]}".yellow
229
+ lib_version_s = record["lib_version"]
230
+ lib_version_s = (lib_version_s == nil || lib_version_s == '') ? "" : "(#{lib_version_s})"
231
+ UI.puts "#{index}. #{record["lib_name"]} #{lib_version_s} ".green "Source: #{record["source_path"]}".yellow
224
232
  end
225
233
  else
226
- UI.puts "无记录".green
234
+ UI.puts "\n无记录".green
227
235
  end
228
236
  else
229
- UI.puts "无记录".green
237
+ UI.puts "\n无记录".green
230
238
  end
231
239
  print "\n"
232
240
  end
@@ -263,8 +271,13 @@ module Pod
263
271
  end
264
272
 
265
273
  def source_lib_name(filePath)
266
- file_name = File.basename(filePath, ".a")
267
- file_name = file_name[3..file_name.length]
274
+ file_name = ""
275
+ if Pathname.new(filePath).extname == ".framework"
276
+ file_name = File.basename(filePath, ".framework")
277
+ elsif Pathname.new(filePath).extname == ".a"
278
+ file_name = File.basename(filePath, ".a")
279
+ file_name = file_name[3..file_name.length]
280
+ end
268
281
  file_name
269
282
  end
270
283
 
@@ -350,7 +363,7 @@ module Pod
350
363
  end
351
364
  @lockfile ||= Lockfile.from_file(Pathname.new(podfile_lock))
352
365
 
353
- UI.section "Analyzer Podfile" do
366
+ UI.section "ybin analyzer" do
354
367
  analyzer = Pod::Installer::Analyzer.new(config.sandbox, config.podfile, @lockfile)
355
368
  @analysis_result = analyzer.analyze
356
369
  @aggregate_targets = @analysis_result.targets
@@ -413,8 +426,8 @@ module Pod
413
426
 
414
427
  def template_source
415
428
  {
416
- 'libPath' => { question: '1/2 请输入映射源码的二进制库.a 的路径(如:/Users/xxx/Desktop/Workspace/xxx.a)' },
417
- 'sourcePath' => { question: '2/2 源码位置(注意版本是否匹配)' },
429
+ 'libPath' => { question: '1/2 请输入静态二进制库的路径(如:/Users/xxx/Workspace/xxx.a 或 /Users/xxx/Workspace/xxx.framework)' },
430
+ 'sourcePath' => { question: '2/2 源码路径(注意: 版本是否匹配)' },
418
431
  }
419
432
  end
420
433
 
@@ -1,3 +1,3 @@
1
1
  module CocoapodsYbin
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cocoapods-ybin
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - monetking
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-09-04 00:00:00.000000000 Z
11
+ date: 2020-09-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler