spec repo
是pods
的一個索引,是全部公開的pods
的podspec
文件的一個倉庫,其實就是一個部署在服務器的Git倉庫,當你使用CocoaPods 後它會被Clone到本地的~/.cocoapods/repos
。這個倉庫只存放podspec
文件html
一、在git上建立私有倉庫地址ios
二、在終端terminal
執行命令git
# pod repo add [Private Repo Name] [GitHub HTTPS clone URL]
$ pod repo add MySpecs https://git.net/winter/MySpecs.git
複製代碼
一、建立 Pod 項目工程xcode
# pod lib create [Project Name]
$ pod lib create MyLib
複製代碼
而後按照步驟一步一步執行,若是碰到建立失敗的狀況,更新 cocoaPods 再試試!緩存
二、添加相關代碼bash
├── MyLib
│ ├── Assets **存放資源文件!!!**
│ └── Classes
│ └── ReplaceMe.m **注意存放你本身實現的庫相關代碼!!!**
複製代碼
├── Example
│ **就是一個樣例工程相關代碼文件**
複製代碼
三、開發模式下測試 pod 打開Example工程目錄下的podfile
文件:服務器
#pod 'MyLib', :path => '../' # 指定路徑
pod 'MyLib', :path => '../MyLib.podspec' # 指定podspec文件
複製代碼
而後在 Example 工程目錄下執行 pod update
命令安裝依賴,打開項目工程,能夠看到庫文件都被加載到Pods子項目中了 不過它們並無在 Pods 目錄下,而是跟測試項目同樣存在於 Development Pods/MyLib 中,這是由於咱們是在本地測試,而沒有把 podspec 文件添加到 Spec Repo 中的緣故。測試庫文件沒有問題,接着咱們須要執行第4步app
四、提交Pod到代碼倉庫,注意:不是podspec
索引倉庫,是代碼倉庫 在終端執行命令:ide
$ git add .
$ git commit -s -m "初始化MyLib 庫"
$ git remote add origin git@git.net:winter/MyLib.git #添加遠端倉庫
$ git push origin master #提交到遠端倉庫
$ git tag -m "first release" "0.1.0" #打上標籤,這個很重要
$ git push --tags #推送tag到遠端倉庫
複製代碼
到這裏,成功提交到遠程代碼倉庫,MyLib Pod 庫就初步完成了代碼實現,接下來就是重點了,將製做的私有庫放到podspec
索引倉庫。測試
podspec
文件到私有Spec Repo
倉庫一、配置podspec
文件
#
# Be sure to run `pod lib lint MyLib.podspec' to ensure this is a
# valid spec before submitting.
#
# Any lines starting with a # are optional, but their use is encouraged
# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html
#
Pod::Spec.new do |s|
s.name = 'MyLib'
s.version = '0.1.0'
s.summary = 'MyLib for example'
# This description is used to generate tags and improve search results.
# * Think: What does it do? Why did you write it? What is the focus?
# * Try to keep it short, snappy and to the point.
# * Write the description between the DESC delimiters below.
# * Finally, don't worry about the indent, CocoaPods strips it!
s.description = <<-DESC
TODO: Add long description of the pod here.
DESC
s.homepage = 'http://www.jianshu.com/u/06f42a993882'
# s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
s.license = { :type => 'MIT', :file => 'LICENSE' }
s.author = { 'winter' => 'winter.wei@hey900.com' }
s.source = { :git => 'https://git.net/winter/MyLib.git', :tag => s.version.to_s }
# s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'
s.ios.deployment_target = '8.0'
s.source_files = 'MyLib/Classes/**/*'
s.resource_bundles = {
'MyLib' => ['MyLib/Assets/*.png']
}
# s.public_header_files = 'Pod/Classes/**/*.h'
# s.frameworks = 'UIKit', 'MapKit'
end
複製代碼
打開MyLib
工程目錄下的MyLib.podspec
文件並參考上面的說明配置好相關選項。 podspec
更多配置請參考: 官方文檔
二、編輯完MyLib.podspec
文件後,須要驗證一下這個MyLib.podspec
文件是否可用
$ pod lib lint
// 若是終端輸出這個信息,就說明驗證經過,不然會提示錯誤信息,去修改
-> MyLib (0.1.0)
MyLib passed validation.
複製代碼
三、驗證經過,想SpecRepo提交podspec
# pod repo push [Repo名] [podspec 文件名字]
$ pod repo push MySpecs MyLib.podspec
複製代碼
若是提交成功 終端上就會輸出一些相關pod信息,若是不成功,則會打印一些失敗信息,切記:失敗後,去解決問題,或者更新cocoaPods。
咱們能夠直接指定某一個依賴的podspec
,這樣就能夠使用公司的私有庫。該方案有利於使企業內部的公共項目支持CocoaPods。
pod 'MySpec', :podspec => 'https://my.com/mySpec.podspec'
複製代碼
須要注意,若是 pod repo push
出現下面的錯誤信息:
can't get podspec validation - ERROR | [iOS] xcodebuild: Returned an unsuccessful exit code 複製代碼
解決辦法,能夠試試:
1,pod lib lint --allow-warnings
2,解決全部的warning
3,pod repo push <repo-name> <podspec-file-name>.podspec --allow-warnings --use-libraries
複製代碼
若是pod lib lint --allow-warnings
出現一些 not find file
之類的warning,必定要解決掉,不然也會出現以上錯誤信息。
CocoaPods 在執行pod instal
l和pod update
時,會默認先更新一次pod spec
索引,使用--no-repo-update
參數能夠禁止其作索引更新操做。
pod install --no-repo-update
pod update --no-repo-update
複製代碼
podspec
裏面
s.resource_bundles = {
'MyLibrary' => ['your/path/Assets/**/*.{png,xib,plist}']
}
複製代碼
通常狀況下,咱們本身建立的pods
添加的資源文件,使用[NSBundle mainBundle]
是找不到該資源的路徑,因此,在這裏,咱們須要建立一個NSBundle
的 category
。
@implementation NSBundle (MyLibrary)
+ (NSBundle *)my_myLibraryBundle {
return [self bundleWithURL:[self my_myLibraryBundleURL]];
}
+ (NSURL *)my_myLibraryBundleURL {
NSBundle *bundle = [NSBundle bundleForClass:[MYSomeClass class]];
return [bundle URLForResource:@"MyLibrary" withExtension:@"bundle"];
}
@end
複製代碼
順便說下,MYSomeClass
這個類能夠是任意類名,可是有個前提,這個類必須是在你建立的library
或者framework
內。再說這個邏輯:先拿到最外面的 bundle,對 framework 連接方式來講是 framework 的 bundle 的根目錄,對靜態庫連接方式來講就是 target client 的 main bundle,而後再去找下面名爲MyLibrary
的 bundle。
上面咱們已經能夠正常訪問咱們本身的 bundle,若是訪問咱們本身 bundle 的圖片資源,仍是同樣建立UIImage
的category
。
#import "UIImage+MyLibrary.h"
#import "NSBundle+MyLibrary.h"
@implementation UIImage (MyLibrary)
+ (UIImage *)my_bundleImageNamed:(NSString *)name {
return [self my_imageNamed:name inBundle:[NSBundle my_myLibraryBundle]];
}
+ (UIImage *)my_imageNamed:(NSString *)name inBundle:(NSBundle *)bundle {
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0
return [UIImage imageNamed:name inBundle:bundle compatibleWithTraitCollection:nil];
#elif __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_8_0
return [UIImage imageWithContentsOfFile:[bundle pathForResource:name ofType:@"png"]];
#else
if ([UIImage respondsToSelector:@selector(imageNamed:inBundle:compatibleWithTraitCollection:)]) {
return [UIImage imageNamed:name inBundle:bundle compatibleWithTraitCollection:nil];
} else {
return [UIImage imageWithContentsOfFile:[bundle pathForResource:name ofType:@"png"]];
}
#endif
}
@end
複製代碼
+ imageNamed:inBundle:compatibleWithTraitCollection:
這個方法iOS8之後纔有,因此須要條件編譯。+ imageWithContentsOfFile:
沒有緩存機制。
xxxxx
有時候在安裝某一第三方會出現 「Unable to find a specification for xxxxx
」 這個問題,在這裏找到了解決方法,只須要把當前Pod的目錄清理一下就好了。在終端執行如下命令:
pod repo remove master
pod setup
複製代碼
setup(pod setup
可能須要花費很長時間)成功後執行install
或update
便可.