1.在自己的私有服務器上創建Git倉庫
第一步:連接私有服務器:
ssh 您的服務器地址
第二步:使用cd命令進入到要創建Git倉庫的目錄。
第三步:使用如下命令創建並初始化Git倉庫:
//test.git要替換成您需要創建的倉庫名稱 sudo git init --bare test.git
第四步:賦權:
sudo chown -R git:git test.git
至此,在私有服務器創建Git倉庫已經完成。
2.編寫自己的代碼並實時更新到Git倉庫
第一步:通過如下指令,將上面創建的空Git倉庫加載到本地:
git clone 完整的倉庫地址
第二步:編寫代碼。
第三步:代碼編寫完成之后,將代碼提交到Git倉庫。
git push
第四步:創建tag並將tag上傳到Git倉庫。
//創建tag git tag v1.0 //將tag更新到遠程倉庫 git push origin --tags
//刪除本地tag git tag -d v1.0 //同步刪除遠程tag git push origin :refs/tags/v1.0
3.Spec Repo
Spec Repo是一個包含了各種支持CocoaPods導入的類庫的一個倉庫,官方的Spec Repo是一個在github上的git repo,在我們安裝CocoaPods時進行 pod setup
步驟時會將其clone到本地目錄 ~/.cocoapods/repos/master
下。
在講私有庫支持CocoaPods之前,我們先看看GitHub庫支持CocoaPods的操作步驟。
3.1GitHub庫支持CocoaPods
第一步:創建Git倉庫並編寫代碼。
第二步:創建tag。
第三步:在項目工程根目錄下創建podspec文件:
pod spec create 工程名稱
第四步:編輯podspec文件,示例如下:
Pod::Spec.new do |s| s.name = "GofShakeAndEmail" s.version = "1.0.2" s.summary = "一個好玩的搖一搖截圖郵件反饋BUG的庫" s.description = <<-DESC 一個使用OC實現的搖一搖截圖郵件反饋BUG的庫. DESC s.homepage = "https://github.com/LeeGof/GofShakeAndEmail" s.license = { :type => 'MIT', :file => 'LICENSE' } s.author = { "LeeGof" => "ligfufida@gmail.com" } s.source = { :git => "https://github.com/LeeGof/GofShakeAndEmail.git", :tag => s.version.to_s } # s.social_media_url = 'https://twitter.com/NAME' s.platform = :ios, '7.0' s.requires_arc = true s.source_files = "GofShakeAndEmail/GofShakeAndEmail/*.{h,m}" s.frameworks = 'Foundation', 'MessageUI', 'UIKit' end
第五步:添加LICENSE文件。CocoaPods強制要求所有的Pods依賴庫都必須有license文件,否則驗證不會通過。license的類型有很多種,詳情可以參考網站https://tldrlegal.com/。在創建github倉庫的時候,可以選擇MIT類型的license。
MIT License Copyright (c) 2017 LeeGof Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
第六步:添加README.md文件。這個文件用於對倉庫進行詳細說明,使用的是markdown標記語言。
# GofShakeAndEmail 我們知道,測試人員在測試客戶端產品時,當出現問題或者BUG的時候,一般是先對頁面截圖,然后從相冊中選擇截圖,加上一段描述放到JIRA上或者直接通過郵件發給開發人員,以方便開發人員進行修改,過程繁瑣。 現在通過本庫,您可以很方便的讓測試人員遇到BUG的時候,搖一搖設備,然后自動截圖並保存到應用的沙盒之中。截圖保存到沙盒之后,在這里會自動的調用系統郵件發送程序,並自動的把錯誤截圖放到郵件正文,在郵件正文,測試人員可以再加上一些對錯誤的描述信息,然后發送給相應的開發,全程操作便利。
做完上面這些步驟之后,我們看一下工程目錄大致如下:
第七步:執行pod驗證指令:
pod lib lint
建議這條命令后面跟着--verbose
的參數(能看到具體的出錯信息),除此之外,這條命令還可以跟其他參數,例如 --allow-warnings 是否允許警告,在用到第三方框架的時候,有的時候是自帶會有warmings的代碼,用這參數可以屏蔽警告如果一切正常。
這條命令執行完后會出現下面的輸出:
【說明】:在執行pod驗證命令的時候,打印出了任何warning或者error信息,驗證都會失敗!如果驗證出現異常,打印的信息會很詳細,我們可以根據對應提示做出修改。
【注意】:在驗證私有庫的時候,直接執行如下指令:
pod lib lint --verbose --allow-warnings
有時候會提示一個錯誤:
遇到這個提示錯誤信息的時候,使用如下指令:
pod lib lint 文件名稱.podspec --use-libraries --allow-warnings
相應的執行上傳指令的時候,也需要加上參數:
pod repo push GofSpecs GofKit.podspec --use-libraries --allow-warnings
第八步:執行pod上傳指令:
pod trunk push GofShakeAndEmail.podspec
通過上述命令即可上傳項目到Cocoapods
官方的倉庫里去,當然如果有新的tag版本的話也是通過該命令進行上傳新的版本到Cocoapods
的。
【注意】:執行上傳指令的時候,有時候會出現這樣的一個錯誤信息:
這通常是git庫權限的問題。進入到對應的git庫,執行如下指令:
sudo chown -R git:git GofSpecs.git
如果是出現下面這種錯誤信息:
[!] Authentication token is invalid or unverified. Either verify it with the email that was sent or register a new session.
執行如下指令:
pod trunk register leegof@qq.com leegof
第九步:查看pod操作是否成功。
pod search GofShakeAndEmail
如果發布成功的話,可以看到搜索結果如下:
【注意】:有時候會遇到搜索不到的情況,如下圖所示:
當遇到上面這種情況的時候,按如下步驟進行操作:
- 執行
pod setup。執行該指令之后,我們再試試“pod search GofWebImage”,如果能夠成功搜索出結果,那么不需要做下面步驟的操作;如果還是搜索不到,那么繼續后續步驟;
- 刪除~/Library/Caches/CocoaPods目錄下的search_index.json文件。
第十步:使用。我們在需要使用的工程項目的Pods文件中,直接加上一句代碼就可以了,詳細的Pods文件使用,可參考iOS依賴庫管理工具之CocoaPods。
pod 'GofShakeAndEmail'
3.2私有庫支持CocoaPods
通過上面的介紹,私有庫和GitHub最大的區別在於GitHub有一個倉庫來存放我們的Podspec文件。知道這點之后,那么我們就開始做如下工作。
第一步:創建一個倉庫,用於存放Podspec文件。創建Git倉庫的方法可查看前面。
第二步:參照3.1小節的內容,一步步執行,到第八步執行上傳指令的時候,因為我們是發布到自己的私有服務器上,因此不能按照上面那樣做了,具體指令如下:
pod repo push GofSpecs GofNetComponent.podspec
第三步:發布成功之后,使用的時候,區別於3.1小節的是,需要在Pods文件中引入Podspec倉庫地址:
source 'git@gofgit:/Data/git/ios/GofSpecs.git' source 'https://github.com/CocoaPods/Specs.git' platform :ios, '7.0' inhibit_all_warnings! target 'GofTransitionDemo' do pod 'GofNetComponent','1.0.1' pod 'MLTransition' end
至此,私有庫就能正常使用Pod指令引入和使用了。
3.3相關問題
問題一:如果需要在發布的私有庫中,使用其他的私有庫,該怎么辦呢?
因為Podspec
文件中並沒有指明私有倉庫地址的地方,那么肯定就不在Podspec
文件里面指明私有倉庫的地方,我們只能在驗證和上傳私有庫的時候進行指明。即在下面這兩條命令中進行指明:
//校驗 pod lib lint GofKit.podspec --sources=https://github.com/CocoaPods/Specs.git,192.168.0.100:Gof/Specs.git //提交 pod repo push GofSpecs GofKit.podspec --source=https://github.com/CocoaPods/Specs.git,192.168.0.100:Gof/Specs.git
問題二:怎樣提供靜態庫?
使用cocoapods-packager插件來方便生成library(靜態庫,動態庫都可以):
//插件安裝 gem install cocoapods-packager
如果提示錯誤:
這個意思就是提示需要管理員權限才可以進入這個文件夾,可以使用如下指令:
sudo gem install cocoapods-packager
生成靜態庫的指令:
pod package GofShakeAndEmail.podspec --library --force
其中--library
指定打包成.a
文件,如果不帶上將會打包成.framework
文件。--force
是指強制覆蓋。
4.附錄:Podspec文件說明
以下內容摘自網頁:http://www.jianshu.com/p/9eea3e7cb3a1
4.1必要屬性
Pod::Spec.new do|s| //項目名 s.name ='HycProject' //版本號 s.version ='1.0.1' //license文件的類型 s.license = 'MIT' //簡單描述 s.summary = 'ATest in iOS.' //項目的getub地址,只支持HTTP和HTTPS地址,不支持ssh的地址 s.homepage ='https://github.com/hyc603671932/HycProject' //作者和郵箱 s.authors = {'HouKavin' => '603671932@qq.com' } //git倉庫的https地址 s.source = { :git=> 'https://github.com/hyc603671932/HycProject.git', :tag =>s.version} //是否要求arc(有部分非arc文件情況未考證) s.requires_arc = true //在這個屬性中聲明過的.h文件能夠使用<>方法聯想調用(這個是可選屬性) s.public_header_files = 'UIKit/*.h' //表示源文件的路徑,這個路徑是相對podspec文件而言的。(這屬性下面單獨討論) s.source_files ='AppInfo/*.*' //需要用到的frameworks,不需要加.frameworks后綴。(這個沒有用到也可以不填) s.frameworks ='Foundation', 'CoreGraphics', 'UIKit' end
4.2可選屬性
Pod::Spec.new do|s| ... ... ... //詳細介紹 s.description = "詳細介紹" //支持的平台及版本 s.platform = :ios, '7.0' //最低要求的系統版本 s.ios.deployment_target= '7.0' //主頁,需填寫可訪問地址 s.homepage = "https://coding.net/u/wtlucky/p/podTestLibrary" //截圖 s.screenshots = "www.example.com/screenshots_1" //多媒體介紹地址 s.social_media_url = 'https://twitter.com/<twitter_username>' //效果和s.public_header_files的相同,只需要配置一種 s.ios.public_header_files = 'URS/URSAuth.h' //不常用,所有文件默認即為private只能用import"XXX"調用 s.ios.private_header_files #依賴關系,該項目所依賴的其他庫 s.dependency 'AFNetworking', '~> 2.3' //可擁有多個dependency依賴屬性 s.dependency 'JSONKit', '~> 1.4' //動態庫所使用的資源文件存放位置,放在Resources文件夾中 s.resource_bundles = { 'Test5' => ['Test5/Assets/*.png'] } //資源文件(具體使用帶考證) s.resources = 'src/SinaWeibo/SinaWeibo.bundle/**/*.png' //建立名稱為Info的子文件夾(虛擬路徑) s.subspec 'Info' do |ss| //應該和s.subspec作用相同(未考證) s.default_subspec='Core'
//多個子subspec
s.default_subspec = ['EmptyView', 'PlaceholderTextView', 'UserManager', 'CellAnimator', 'KFImageProcessor']
end
4.3s.source_files
//下載AppInfo文件夾下的所有文件,子文件夾不識別 s.source_files ='AppInfo' //下載AppInfo目錄下所有格式文件 s.source_files ='AppInfo/*.*' **/*表示Classes目錄及其子目錄下所有文件 s.source_files = 'AppInfo/**/*' //下載HycProject文件夾下名稱為AppManInfo和AppWomanInfo的共4項文件 s.source_files ='HycProject/App{Man,Woman}Info.{h,m}' //目標路徑下的文件不進行下載 s.ios.exclude_files = 'AppInfo/Info/json'
4.4文件層次
Pod::Spec.new do|s| //第一層文件夾名稱HycProject s.name ='HycProject' ... ... ... //第二層文件夾名稱AppInfo(虛擬路徑) s.subspec 'AppInfo' do |ss| //下載HycProject文件夾下AppInfo的.h和.m文件 ss.source_files = 'HycProject/AppInfo.{h,m}' //允許使用import<AppInfo.h> ss.public_header_files = 'HycProject/AppInfo.h' //依賴的frameworks ss.ios.frameworks = 'MobileCoreServices', 'CoreGraphics' //第三層文件夾名稱Info(虛擬路徑) ss.subspec 'Info' do |sss| //最低要求的系統版本7.0 sss.ios.deployment_target = '7.0' //只允許使用import"AppInfo.h"訪問 sss.ios.private_header_files = 'AppInfo/Info/**/*.h' // 下載路徑下的.h/.m/.c文件 sss.ios.source_files = 'AppInfo/Info/**/*.{h,m,c}' //引用xml2庫,但系統會找不到這個庫的頭文件,需與下方sss.xcconfig配合使用(這里省略lib) sss.libraries = "xml2" //在pod target項的Header Search Path中配置:${SDK_DIR}/usr/include/libxml2 sss.xcconfig = { 'HEADER_SEARCH_PATHS' => '${SDK_DIR}/usr/include/libxml2' } //json目錄下的文件不做下載 sss.ios.exclude_files = 'AppInfo/Info/json' end end end
4.5后續步驟
//驗證podspec文件是否可正常使用 命令行:pod lib lint //上傳podspec到trunk服務器中 命令行:pod trunk push HycProject.podspec //上傳需要一定時間,成功后更新本地pod依賴庫 命令行:pod setup //查看代碼有沒有通過審核版本是否更新 命令行:pod search HycProject //下載線上git倉庫(Podfile文件不在此討論) 命令行:pod install