一 臭墨、前言
最近要做一個新的項(xiàng)目需要用到Google的Protocol Buffer赘来,所以最近兩天一直在學(xué)習(xí)這個旭贬。在網(wǎng)上看了很多人寫的相關(guān)博客瘩将,發(fā)現(xiàn)他們寫的配置環(huán)境的步驟不盡相同吟税,并且不需要那么復(fù)雜,所以就想寫一篇最新的文章姿现。 配置環(huán)境:mac OS 10.11.1 本文若有敘述錯誤之處肠仪,歡迎指點(diǎn)。
二 备典、Protocol Buffer簡介
Protocolbuffer(簡稱Protobuf或PB)是由Google推出的一種數(shù)據(jù)交換格式异旧,它獨(dú)立于語言,獨(dú)立于平臺提佣。Google 提供了三種語言的實(shí)現(xiàn):java吮蛹、c++ 和 python,每一種實(shí)現(xiàn)都包含了相應(yīng)語言的編譯器以及庫文件拌屏〕闭耄可以把它用于分布式應(yīng)用之間的數(shù)據(jù)通信或者異構(gòu)環(huán)境下的數(shù)據(jù)交換。與傳統(tǒng)的XML和JSON不同的是倚喂,它是一種二進(jìn)制格式每篷,免去了文本格式轉(zhuǎn)換的各種困擾,并且轉(zhuǎn)換效率非扯巳Γ快焦读,由于它的跨平臺、跨編程語言的特點(diǎn)舱权,讓它越來越普及矗晃,尤其是網(wǎng)絡(luò)數(shù)據(jù)交換方面日趨成為一種主流。
PB目前托管在GitHub,鏈接地址:https://github.com/google/protobuf,源碼的主要功能可以分為兩部分:
PB基礎(chǔ)庫:完成對象->二進(jìn)制數(shù)據(jù)的序列化宴倍、二進(jìn)制數(shù)據(jù)->對象的反序列化這兩個轉(zhuǎn)換過程的支持张症;
PB編譯器:源碼生成器,將PB格式定義文件啊楚。proto(PB數(shù)據(jù)格式的一種定義文件)轉(zhuǎn)換為對象源碼(支持C++,JAVA,Python等格式)吠冤。
截止目前PB的最新版本為3.0.0-beta-2,已經(jīng)加入了對Objective-C的支持(其它之前低版本中也已經(jīng)有OC擴(kuò)展支持)。
在使用cocoaPods的項(xiàng)目里使用pod search ProtocolBuffers進(jìn)行搜索恭理,搜索結(jié)果如下:
注意:本文是以ProtocolBuffers:https://github.com/alexeyxo/protobuf-objc.git 為例進(jìn)行演示的拯辙,因?yàn)樗傻拇a支持ARC。
三、Mac環(huán)境配置
安裝很簡單涯保,對著README操作一遍即可诉濒,我貼出自己在終端的命令行。需要輸入的命令行依次為:
1)打開終端夕春,查看mac里面有沒有裝Homebrew未荒,鍵入以下命令
brew -v
2)如果沒有安裝Homebrew就使用下面的命令安裝
ruby -e “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)”
3)安裝protobuf編譯器和所需的工具
brew install automake
brew install libtool
brew install protobuf
具體演示:(省略部分命令)
Last login: Fri Jan 8 09:59:02 on ttys001
wushangkundeiMac:~ wushangkun$ brew -v
-bash: brew: command not found
wushangkundeiMac:~ wushangkun$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
**==>**** This script will install:**
/usr/local/bin/brew
Press RETURN to continue or any other key to abort
**==>**** /usr/bin/sudo /bin/chmod g+rwx /usr/local/. /usr/local/bin**
Password:
**==>**** /usr/bin/sudo /usr/sbin/chown wushangkun /usr/local/. /usr/local/bin**
**==>**** /usr/bin/sudo /usr/bin/chgrp admin /usr/local/.
remote: Counting objects: 3934, done.
remote: Compressing objects: 100% (3777/3777), done.
remote: Total 3934 (delta 34), reused 2251 (delta 22), pack-reused 0
Receiving objects: 100% (3934/3934), 3.43 MiB | 888.00 KiB/s, done.
Resolving deltas: 100% (34/34), done.
From https://github.com/Homebrew/homebrew
* [new branch] master -> origin/master
Checking out files: 100% (3936/3936), done.
HEAD is now at ef28579 ipfs: update 0.3.10 bottle.
**==>**** Installation successful!**
**==>**** Next steps**
Run `brew help` to get started
wushangkundeiMac:~ wushangkun$ brew install automake
**==>**** Installing dependencies for automake: ****autoconf**
**==>**** Installing automake dependency: ****autoconf**
######################################################################## 100.0%
In order to prevent conflicts with Apple's own libtool we have prepended a "g"
so, you have instead: glibtool and glibtoolize.
**==>**** Summary**
?? /usr/local/Cellar/libtool/2.4.6: 69 files, 3.6M
wushangkundeiMac:~ wushangkun$ brew install protobuf
mkdir -p /Users/wushangkun/Library/Python/2.7/lib/python/site-packages
echo 'import site; site.addsitedir("/usr/local/lib/python2.7/site-packages")' >> /Users/wushangkun/Library/Python/2.7/lib/python/site-packages/homebrew.pth
**==>**** Summary**
?? /usr/local/Cellar/protobuf/2.6.1: 118 files, 6.9M
wushangkundeiMac:~ wushangkun$ ```
4)以上步驟進(jìn)行完之后,開始Clone this repository及志,在桌面新建protobuf-objc 文件夾片排,在終端里進(jìn)入該文件下下載代碼
>git clone [https://github.com/alexeyxo/protobuf-objc.git](https://github.com/alexeyxo/protobuf-objc.git)
5)Build it !
>./scripts/build.sh
具體演示:
```objc
Last login: Fri Jan 8 10:06:15 on ttys001
wushangkundeiMac:~ wushangkun$ cd /Users/wushangkun/Desktop/protobuf-objc
wushangkundeiMac:protobuf-objc wushangkun$ git clone https://github.com/alexeyxo/protobuf-objc.git
Cloning into 'protobuf-objc'...
remote: Counting objects: 2788, done.
remote: Total 2788 (delta 0), reused 0 (delta 0), pack-reused 2788
Receiving objects: 100% (2788/2788), 32.92 MiB | 683.00 KiB/s, done.
Resolving deltas: 100% (1761/1761), done.
Checking connectivity... done.
wushangkundeiMac:protobuf-objc wushangkun$ ls
protobuf-objc
wushangkundeiMac:protobuf-objc wushangkun$ cd protobuf-objc/
wushangkundeiMac:protobuf-objc wushangkun$ ./scripts/build.sh
+ ./autogen.sh
glibtoolize: putting auxiliary files in '.'.
glibtoolize: copying file './ltmain.sh'
********* ********* ********* *********
省略部分。速侈。率寡。
********* ********* ********* *********
mv -f .deps/objectivec-descriptor.pb.Tpo .deps/objectivec-descriptor.pb.Po
mv -f .deps/objc_message.Tpo .deps/objc_message.Po
/bin/sh ../../libtool --tag=CXX --mode=link g++ -I/usr/local/include -lprotobuf -lprotoc -L/usr/local/lib -o protoc-gen-objc main.o objc_enum_field.o objc_file.o objc_message_field.o objc_enum.o objc_generator.o objc_primitive_field.o objc_extension.o objc_helpers.o objc_field.o objc_message.o objectivec-descriptor.pb.o
libtool: link: g++ -I/usr/local/include -o protoc-gen-objc main.o objc_enum_field.o objc_file.o objc_message_field.o objc_enum.o objc_generator.o objc_primitive_field.o objc_extension.o objc_helpers.o objc_field.o objc_message.o objectivec-descriptor.pb.o -Wl,-bind_at_load -lprotobuf -lprotoc -L/usr/local/lib
make[2]: Nothing to be done for `all-am'.
+ make install
Making install in src/compiler
../.././install-sh -c -d '/usr/local/bin'
/bin/sh ../../libtool --mode=install /usr/bin/install -c protoc-gen-objc '/usr/local/bin'
libtool: install: /usr/bin/install -c protoc-gen-objc /usr/local/bin/protoc-gen-objc
make[2]: Nothing to be done for `install-data-am'.
make[2]: Nothing to be done for `install-exec-am'.
make[2]: Nothing to be done for `install-data-am'.
wushangkundeiMac:protobuf-objc wushangkun$
運(yùn)行完成后,最終會生成一個protoc-gen-objc插件倚搬,被安裝到/usr/local/bin/目錄下冶共。如果沒有錯誤的話,以后便可以用這個命令將.proto文件轉(zhuǎn)換為不同語言的源代碼文件。
四每界、為工程添加PB依賴庫#
添加PB依賴庫有兩種方式捅僵,可以直接把/src/runtime/ProtocolBuffers.xcodeproj作為子項(xiàng)目添加到你的工程里,具體添加方式和注意事項(xiàng)可自行參閱相關(guān)文檔解決眨层。我現(xiàn)在使用CocoaPod來添加依賴庫:
1)在終端中進(jìn)入你項(xiàng)目的文件夾庙楚,利用vim創(chuàng)建一個名為Podfile的文件,輸入i進(jìn)入vim編輯模式 谐岁;
2)在你的Podfile中添加:
platform:ios,’7.0’
pod ‘ProtocolBuffers’, ‘~> 1.9.9.2’
按ESC后取消編輯狀態(tài)醋奠,輸入:wq回車退出。需要注意的幾點(diǎn):platform那一行伊佃,ios三個字母都要小寫,而且與前面的冒號之間不能有間隔沛善,后面的版本號也可以不寫航揉,但是有些開源庫對版本是有要求的,比如要在6.0以上才能運(yùn)行金刁,遇到這樣的開源庫就需要寫上版本號帅涂。
3)在Terminal中執(zhí)行 :pod install,完成后退出工程尤蛮,再次進(jìn)入就會看到PB依賴庫了媳友。以后使用的時候切記如下兩點(diǎn):
① 從此以后需要使用Cocoapods生成的 .xcworkspace文件來打開工程,而不是使用以前的.xcodeproj文件产捞。
② 每次更改了Podfile文件醇锚,都需要重新執(zhí)行一次pod update命令。
補(bǔ)充: 當(dāng)執(zhí)行pod install之后,除了Podfile焊唬,還會生成一個名為Podfile.lock的文件恋昼,它會鎖定當(dāng)前各依賴庫的版本,之后即使多次執(zhí)行pod install也不會更改版本赶促,只有執(zhí)行pod update才會改變Podfile.lock在多人協(xié)作的時候液肌,這樣可以防止第三方庫升級時候造成大家各自的第三方庫版本不一致。所以在提交版本的時候不能把它落下鸥滨,也不要添加到.gitignore中嗦哆。
wushangkundeiMac:~ wushangkun$ cd /Users/wushangkun/Desktop/J1Test/J1Hospital
wushangkundeiMac:J1Hospital wushangkun$ vim Podfile
wushangkundeiMac:J1Hospital wushangkun$ pod install
Updating local specs repositories
Analyzing dependencies
Downloading dependencies
Installing ProtocolBuffers (1.9.9.2)
Generating Pods project
Integrating client project
[!] Please close any current Xcode sessions and use `J1Hospital.xcworkspace` for this project from now on.Sending stats
Pod installation complete! There is 1 dependency from the Podfile and 1 total
pod installed.
wushangkundeiMac:J1Hospital wushangkun$
注意: 在使用的時候你可能會碰到在代碼里導(dǎo)入(#import)頭文件沒有提示,雖然自己手寫出來也能使用婿滓,但總覺得不方便吝秕。在stackoverflow上找到了解決辦法:把pods目錄添加到用戶頭文件檢索的路徑即可。具體實(shí)現(xiàn)方法如下:
選擇target ——- BuildingSettings ——– User Header Search Paths空幻,雙擊空白區(qū)域點(diǎn)擊“+”號烁峭,輸入“$(PODS_ROOT)”,選擇recursive(會在相應(yīng)的目錄遞歸搜索文件)秕铛。
這樣設(shè)置完成后约郁,再導(dǎo)入第三方庫就會有提示了。
五但两、使用PB編譯器編譯.proto文件
為了驗(yàn)證ProtocolBuffer環(huán)境已經(jīng)搭建好了鬓梅,我們就做個測試。在桌面建一個prototest文件夾谨湘,直接拷貝電腦里一個已有的User.proto文件做測試
然后通過以下命令來生成model的源代碼文件:
protoc --plugin=/usr/local/bin/protoc-gen-objc User.proto --objc_out="./"
在當(dāng)前目錄下便可以看到User.pb.h和User.pb.m這兩個文件了(需要注意的是生成的代碼是支持ARC的!!)绽快。將生成的 .h 和 .m 文件添加到工程中,編譯紧阔。
這里會提示找不到GeneratedMessageProtocol坊罢。你只需要將其注釋掉就行了。