CameronL's Blog

不积跬步,无以至千里

0%

CocoaPods学习二:创建本地私有仓库

上一篇文章讲到了创建自己的cocoapods公有库,这次我介绍一下工程里面,如何用cocoapods管理本地的私有仓库。

步骤一:本地创建好文件夹和文件

我们先创建文件夹CommonUtil,在里面创建Classes文件夹,把需要的.h和.m文件拖进去,如图:

步骤二:创建和配置.podspec文件

终端命令行里面去到CommonUtil文件夹,执行pod spec create CommonUtil创建.podspec文件

打开CommonUtil.podspec修改配置,因为是本地的,所以很多可以忽略的,证书不需要,homepage和source地址都不需要,其他的和公有库一样。想详细了解.podspec的配置,请看官网介绍:Specs and the Specs Repo

步骤三:本地验证pod是否能通过

执行本地验证命令$ pod lib lint --allow-warnings,–allow-warnings是用来忽略警告的,如图所以是验证通过的了

步骤四:通过pod安装本地私有库

我们新建一个demo工程,在工程主目录新建一个Local Pods文件夹,把CommonUtil目录拷贝到Local Pods文件夹里,如图:

命令行去到Demo的主工程目录,执行$ pod init,主工程目录打开刚生成的Profile文件,配置如下

1
2
3
4
5
6
7
8
# Uncomment the next line to define a global platform for your project
platform :ios, '9.0'

target 'Demo' do
use_frameworks!
pod 'CommonUtil' :path => 'Local Pods/CommonUtil'

end

接下来就是通过cocoapods安装本地库了,命令行执行$ pod install,如图:

然后在项目demo就可以看到多了.xcworkspace和.lock文件及pod文件夹。点击.xcworkspace文件打开项目看看,真的安装好了,本地库安装的pod库是在Development Pods目录下的,如图:

在工程里面可以直接修改Development Pods里面的文件,下次$ pod install也不会还原的

以上,谢谢阅读

CocoaPods学习一:创建自己的公共库

问题一:什么是自己的公共库?

自己的公共库,就是把自己的项目提交到公开的仓库管理平台,例如GitHub,开源中国等等。使用pod repo命令创建.podspec,并发布到cocoapods的公共索引库。

问题二:这样做的好处是什么?

通常在开发过程中,大多时候,我们有很多公共的方法,例如验证手机号是否合法,一些设置UIView的操作。为了避免写一些重复的代码,我们通常会把这些方法放在分类里面,或者做成一些公共组件,在工程不同的地方都可以用到。为了以后这些方法可以在其他工程也可以用到,我们可以使用cocoapods把这些小功能,封装成一个我们自己的库,下次使用的时候只要pod配置到工程里面,就可以了。

步骤一:在GitHub创建工程仓库

以在GitHub上面创建工程为例,我们现在GitHub上面创建一个工程

我这里选择的是公有库,.ignore我们选择objective,或者swift。证书我们选择MIT就可以,这个后面是可以改的。点击create后,我们把工程clone到我们本地来。

步骤二:创建. podspec文件

1)创建方法一:

第一种方法,我们去到clone指定的目录,创建一个Classes文件夹(一般这个名字,也可以去其他的),把想放在公共库的文件拷贝进去。
命令执行:

$ pod spec create CLBasicLib //CLBasicLib是你的库名

这里创建了.podspec文件,这个文件就是最重要的。去看看文件夹里面是不是多了这个文件,如图:

打开.podspec文件,通过编辑器打开,修改相应的内容,想详细了解更多的.podspec文件内容,请看官网介绍:Specs and the Specs Repo。把不需要的删除,修改完后如图:

大概有这些:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
s.name					//一般不需要修改,它对应.podspec文件的名字,如果不相同就会报错;

s.version //是你库的版本号;

s.version //库简介;

s.description //库描述,这个库描述一定要比简介长;

s.homepage //远程仓库的主页,对应你项目库的主页,不是项目地址,不带.git后缀的;

s.license //是证书,刚开始创建远程项目时选择的;

s.author //作者联系名和邮箱;

s.platform //支持的平台,这个必须要的,要不会包错,包没有找到头文件或者没有找到UIKit;

s.source //资源的地址和tag,这里的地址是库的地址,带.git的,tag要对应远程的tag;

s.source_files //资源文件,通过这路径找到对应的文件;

s.public_header_files //暴露的.h文件,用到静态库;

s.requires_arc //是否支持ARC;

s.ios.vendored_libraries //静态库路径,我这里用到了静态库。

.podspec文件是根据你项目具体情况来配置的,有很多我也没有用到,比如资源库、依赖的第三方库、frame框架、系统框架等等,具体请去官网看介绍,这里不一一说了。

步骤三:把本地代码上传到远程仓库,打上对应的tag版本

1
2
3
4
5
$ git add .

$ git commit -m "xxxx"

$ git push

打上tag

1
2
3
$ git tag "0.0.1"

$ git push --tags

步骤四:注册Cocoapods账号

可以通过在命令行输入$ pod trunk -h查看pod trunk的相关命令。

1
2
3
4
5
$ pod trunk me //查看有没有注册,有的话就是相关的注册账号的信息

$ pod trunk register 邮箱地址 ‘用户名’ --description='描述信息' //注册Cocoapods账号

$ pod trunk push xx.podspec --allow-warnings //提交到pod,最后用到

步骤五:验证pod是否通过

验证pod配置是否通过

1
2
3
4
5
6
7
$ pod lib lint   //本地验证 

$ pod spec lint  //本地和远程验证

$ pod lib lint --verbose //显示详细的检测过程,出错时会显示详细的错误信息

$ pod lib lint --allow-warnings  //允许警告,用来解决存在警告导致不能通过校验的问题

如果出现绿色字passed validation就是验证通过,如图所示:

步骤六:提交pod和检查库

pod验证通过,就可以执行命令提交了

$ pod trunk push xx.podspec --allow-warnings

如果没有问题,等待几分钟就ok了,再执行$ pod trunk me,可以看到自己的信息,和自己的库,如图所示:

可以通过$ pod search xxx搜索自己的库了,如果搜索不到,请清理一下pod缓存

1
$ rm ~/Library/Caches/CocoaPods/search_index.json  //删除pod的缓存

步骤七:版本更新

版本更新,和第一次提交的步骤差不多,简单的说明一下:

1.更改.podspec里面的版本号

1
s.version      = "0.0.2" //修改0.0.2版本,不能是之前的版本,要不提交不成功

2.提交到远程仓库

1
2
3
4
5
$ git add .

$ git commit -m "xxx"

$ git push

3.打tag并提交

1
2
3
$ git tag "0.0.2"

$ git push --tags

4.验证pod,并提交到cocoapods

1
2
3
4
5
$ pod spec lint  //本地和远程验证

$ pod trunk push xx.podspec --allow-warnings`

$ pod search xxx //查询库

结束

上面内容就是创建自己的公有库的过程,其实个人觉得发布的步骤可以忽略,因为自己做的库,一般只是自己用到,不需要发布到cocoapods,我们一般只要在podfile里面指定需要pod的库的git地址就可以

1
2
3
4
5
//指定分支
pod 'xxxx', :git => 'https://github.com/cameronli/CLBasicLib', :branch => 'develop', :subspecs => [ 'Core', 'UI' ]

//指定tag
pod 'xxxx', :git => 'https://github.com/cameronli/CLBasicLib', :tag => '0.0.2', :subspecs => [ 'Core', 'UI' ]

以上,谢谢阅读

配置http 代理访问

$ export http_proxy=socks5://127.0.0.1:1080

配置https 代理访问

$ export https_proxy=socks5://127.0.0.1:1080

配置http和https访问

$ export all_proxy=socks5://127.0.0.1:1080

取消http 代理访问

$ unset http_proxy

取消https 代理访问

$ unset https_proxy

取消http和https 代理访问

$ unset all_proxy

##现在有两个git账户,一个是公司的gitLab,一个是gitHub,通过配置使两个共存。

生成gitlab(设为:默认)ssh key

1.通过ssh-keygen生成key,默认会在~/.ssh/下生成id_rsa(私钥)和id_rsa.pub(公钥)

ssh-keygen -t rsa -C 'your-email' 

2.拷贝key

pbcopy < ~/.ssh/id_rsa.pub

3.验证

ssh -T git@your-gitlab-server

以上完成gitlab账户的ssh key配置

生成github的ssh key

1.使用参数-f指定key的文件名id_rsa.github

ssh-keygen -t rsa -f ~/.ssh/id_rsa.github -C 'your-email'

2.拷贝key到github

3.添加config

cd ~/.ssh/
touch config

在config写入下面的内容:

Host github.com
    IdentityFile ~/.ssh/id_rsa.github
    User git

4.验证github

ssh -T git@github.com

以上完成了多个git的ssh key配置

###前提
最近有同事问起两个方法,突然想起自己以前有掉过这两个方法的坑,然后自己网上查了一下,发现自己对这两个方法的理解还不是很透彻,所以写下来加深印象

前提

前一段时间在开发的过程中,遇到了一个坑,当我给某个View添加阴影效果的时候,因为这个View的Size是动态的,然后动态改变View的size的时候,阴影没有随着改变,用了半天才把这个问题解决,最后总结的时候觉得是自己对阴影效果理解不透彻,所以在此记录一下,以便加深印象,下面附上代码分析:

代码分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// shadowColor阴影颜色
view.layer.shadowColor = [UIColor blackColor].CGColor;

// shadowOffset阴影偏移,x向右偏移4,y向下偏移4,默认(0, -3)
view.layer.shadowOffset = CGSizeMake(4,4);

// 阴影透明度,默认0
view.layer.shadowOpacity = 0.3;

// 阴影半径,默认3
view.layer.shadowRadius = 4;

// shadowPath阴影路径
view.layer.shadowPath = [[UIBezierPath bezierPathWithRect:view.bounds] CGPath];

注意
shadowPath可以提前告诉 CoreAnimation 你要渲染的view的形状的Shape,可以减少离屏渲染的计算时间,大大的提高性能,防止低性能设备的卡顿出现

然而!!!但是!!!意外发生了。。。

因为设置了shadowPath,当因为屏幕的不一样,autolayout会改变view的size,或者某些的操作改变了view的size,shadowPath没有随着改变,导致阴影的位置对不上,一开始没有往这方面想,以为是分辨率不一样要不同的处理,弄了半天。。。

最后发现解决问题的方向搞错了,网上终于找了真正的原因,下面是个人觉得比较好的解决方式,上代码!

1
2
3
4
- (void)layoutSubviews {
[super layoutSubviews];
self.layer.shadowPath = [UIBezierPath bezierPathWithRect:self.layer.bounds].CGPath;
}

新建一个UIView的子类,重写layoutSubviews方法,当view改变大小会调用此方法,然后相应的改变shadowPath,完美解决!!!

end


在行首输入 1-6 个 # 符号。符号的个数决定了标题的层级:

1级标题

# 1级标题

2级标题

## 2级标题

3级标题

### 3级标题

4级标题

#### 4级标题
5级标题
##### 5级标题
6级标题
###### 6级标题

强调

### 强调

----------

加粗:

加粗文本

**加粗文本**

斜体:

斜体文本

*斜体文本*

链接


链接文本

[链接文本](http://example.com/)

图片


图片标题

![图片标题](http://lkl.mx/img/EkZYGsPBg)

列表


有序列表:

  1. 第一项
  2. 第二项
  3. 第三项
1
2
3
1. 第一项
2. 第二项
3. 第三项

无序列表:

  • 列表项
  • 列表项
  • 列表项
1
2
3
- 列表项 
- 列表项
- 列表项

引用


Stay hungry, stay foolish.

1
> Stay hungry, stay foolish.

Code


行内代码:foo.go() .

`foo.go()` 

多行代码:

1
2
let app = "Markdown"
print("Good")
1
2
let app = "Markdown"
print("Good")

缩紧代码


四个空格或者一个 Tab 表示缩进代码:

这是一个普通的段落。

这是一个
代码块

在输入每行内容前加tab

表格


简单的表格:

标题 标题 标题
单元格 单元格 单元格
单元格 单元格 单元格
1
2
3
4
标题 | 标题 | 标题
------- | ------- | -------
单元格 | 单元格 | 单元格
单元格 | 单元格 | 单元格

你还可以添加一些边框:

标题 标题 标题
单元格 单元格 单元格
单元格 单元格 单元格
1
2
3
4
| 标题 | 标题 | 标题 |
| ------- | ------- | ------- |
| 单元格 | 单元格 | 单元格 |
| 单元格 | 单元格 | 单元格 |

你可以控制单元格的对齐方式:

标题 标题 标题
1
2
3
4
标题 | 标题 | 标题
:----- | :----: | ------:
左 | 中 | 右
左 | 中 | 右

删除


Strikethrough

1
~~Strikethrough~~

分割线


三种类型的分割线:


1
---

1
* * *

1
- - - -

换行


一 在行尾添加两个空格或者换行符代表换行:

这行的行尾油两个空格
这是一个新行。

刚刚搭好个站,这是我的Blog第一篇文章,用的是HEXO,主题用的是Yilia,记录一下,希望以后可以多写一些文章🙏。

下面是一些基本的HEXO命令

Quick Start

Create a new post

1
2
3
$ hexo new "My New Post"
//缩写
$ hexo n "My New Post"

More info: Writing

Run server

1
2
3
$ hexo server
//缩写
$ hexo s

More info: Server

Generate static files

1
2
3
$ hexo generate
//缩写
$ hexo g

More info: Generating

Deploy to remote sites

1
2
3
$ hexo deploy
//缩写
$ hexo d

More info: Deployment