JHHK

欢迎来到我的个人网站
行者常至 为者常成

4.组件二进制(上)

目录

快速开始

一、索引速度

索引完成后可以更好的使用xcode:代码补全、跳转到定义
索引做了哪些事:词法分析、语法分析、语义分析、建立符号表,建立引用关系
xcode自定义了clang,所以才有indexing,我们也可以在配置项中关掉indexing来提高编译速度
build-setting搜索:COMPILER_INDEX_STORE_ENABLE

二、组件二进制

使用组件二进制:1、提高编译速度。2、保护源代码
如何使用:在podfile文件内配置相关flag,然后从文件服务器下载二进制文件的.zip文件
相关技术:xcframework文件,xcframework 不是任何编译器和链接器支持的文件格式,而是xcode支持的文件格式
他包含了多种架构格式,在编译时xcode会自动选择对应的架构,而不用像lipo命令那样剥离或合并不同的架构

三、创建一个Gem

带命令行工具的Gem,在工程目录下创建一个bin目录,并且在gemspec文件内配置命令行工具的名字
修改gemspec文件

还没研究明白…

索引速度index

一、介绍

在iOS工程中,当你打开项目时,Xcode会执行一系列操作,其中之一就是进行索引(Indexing)。
索引是一个用于加速代码导航和查找的过程,它会分析项目中的源代码文件,并构建一个数据结构,以便更快地定位和理解代码。
具体而言,索引过程包括以下几个步骤:
词法分析
语法分析
语义分析
建立符号表
建立引用关系
索引的目的是为了提高代码编辑器和导航工具的性能,使开发者能够更快速、准确地定位和理解代码。
一旦索引完成,你就可以更容易地使用Xcode的功能,比如代码补全、跳转到定义、查找引用等。
初次打开项目时,索引可能需要一些时间,但它可以提供更好的开发体验。

二、关于clang

xcode其实自定义了clang

# 这个clang是xcode自定义的
22:33:14 › which clang
/usr/bin/clang

# 执行指令
clang --help-hidden

# 然后搜索index-store-path
-index-store-path <value>
                        Enable indexing with the specified data store path

也可以从homebrew安装一个没有index的clang

关掉xcode的index

组件二进制

一、关于二进制说明

三方库和私有库从源码转为二进制之后,会提高编译速度
二进制的生成,应该在开发这个库的开发人员手里。

xy:我们平时在执行pod install的时候,会根据podfile把每个Pod的源码下载下来,然后设置好依赖。
在编译的时候生成对应的静态库和动态库
如果是二进制组件,我们会根据podfile内设置的flag,直接将二进制的组件从仓库内下载下来,所以提高了编译速度

lipo命令会把多种架构合到一起,有时候还要再拆分出来,xcframework不会

xcframework 不是任何编译器和链接器支持的文件格式,而是xcode支持的文件格式 他包含了多种架构格式,在编译时xcode会自动选择对应的架构

二、二进制组件的实现思路

做一个命令:比如在三方库目录下执行一个 pod cat build 就会自动进行二进制生成然后推送到对应的仓库和私有源
做一个gem的命令行工具,然后将他变为cocoapods插件的一部分

做一个插件:在执行pod install 的时候来做这个事情
给cocoapods制作一个插件:pod plugins –help

插件里可以调用命令,命令里边调用不到插件

这里表述的有些混乱,还未真正理解,后续再回来补充

Gem制作

一、创建Gem工程

第一步:bundle gem cocoapods-cat-bin
在执行这个命令时,终端内会有很多选择提示,暂时还不知道是什么,后续补充

第二步:配置cocoapods-cat-bin.gemspec文件。文件内各个选项的作用
1、version文件的配置,如不不知道参考别人的成熟的gem,比如cocoapods.使用require引用文件
2、ruby版本配置
3、files配置 %w[fileName1 fileName2],资源文件配置。%w[] 表示空格分隔的字符串数组
4、spec.executables = %w[cat_bin] 表示bin目录下的cat_bin是个命令行文本,将来会被放到相应的目录下,可以作为命令行工具使用
5、spec.require_paths = [“lib”] require fileName 的起始路径
6、spec.add_runtime_dependency ‘cocoapods’ 依赖的三方库

第三步:Gemfile文件内,配置 gemspec文件

source "https://rubygems.org"
gemspec

# gem "rake", "~> 12.0"
# gem "rspec", "~> 3.0"

第四步:设置对外的暴露文件,工程目录/lib/cocoapods-cat-bin.rb

第五步:执行bundle install 如果有错误进行排错
1、错误一:require的路径问题,根据提示修改路径引用,确保引用到对应的文件
2、错误二:todo问题,gemspec文件内带todo的行要进行填写

第六步:创建cocoapods_plugin.rb文件
1、cocoapods要求在lib文件下要有一个cocoapods_plugin.rb文件
2、根据这个文件cocoapods才能将插件加载进去
3、将来才能在终端使用我们的命令行工具

二、实现一个pod cat 命令

目录结构如下

cat.rb的文件内容如下

#!/usr/bin/env ruby
require 'cocoapods'

module Pod
  class Command
    class Cat < Command
      self.summary = 'Cat bin'
      self.description = 'Cat bin'

      # Cat 初始化的时候调用
      def initialize(argv)
        super
      end

      # 重写run方法,执行 pod cat 的时候会调用
      def run
        p '111'
      end
    end
  end
end

cat_bin文件内容如下

if $PROGRAM_NAME == __FILE__
    ENV['BUNDLE_GEMFILE'] = File.expand_path('../Gemfile', __dir__)
    require 'bundler/setup'
end

require "cocoapods-cat-bin/command/cat"
require "cocoapods-cat-bin/command/build"

# 传递过来的参数 ["cat"]
# 执行 pod cat
# 会找到Cat类下面的run方法进行调用
Pod::Command.run(ARGV)

launch.json文件内容如下

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Debug Cat Bin",
            "type": "rdbg",
            "request": "launch",
            "script": "${workspaceRoot}/bin/cat_bin",
            "args": [
                "cat",
            ],
        }
    ]
}

还没有研究明白

制作带命令行的Gem,可以使用 thor
见 helloRuby 项目下的 mypod.zip

module Mypod
  class Command < Thor
    desc 'hello', 'Say hello'
    def hello
      puts 'Hello from MyPodCommand!'
    end
  end
end

行者常至,为者常成!





R
Valine - A simple comment system based on Leancloud.