Cocoapods流程及pod庫的制作

序:

對(duì)于 Cocoapods济似,你是否還只知道 pod installpod update盏缤,有時(shí)候還會(huì)摻雜上 pod search砰蠢, pod setup等,對(duì)于它的工作流程都不是很熟悉唉铜,又或許你在搞組件化台舱,但是對(duì)于pod庫的制作流程有些記不清,可以瀏覽瀏覽

說來慚愧潭流,2015年底參加工作的時(shí)候竞惋,我的小組長(zhǎng)告訴我有一個(gè)管理第三方的工具,啥配置都不用管灰嫉,拉下來就用拆宛,升級(jí)一個(gè)命令就行...

離職之后在另外兩家公司都沒有使用,我對(duì) Cocoapods 的感覺讼撒,好像什么都知道浑厚,又好像什么都不知道,跳槽到58后發(fā)現(xiàn)這邊在搞組件化用到了根盒,重新整理一下

目錄

  • 一钳幅、Cocopods流程及使用
  • 二、pod庫的制作
  • 三炎滞、pod私有庫的制作(一般用于組件化)

一贡这、Cocopods流程及使用

Cocoapods工作流程

作用:管理Xcode依賴的第三方框架

手動(dòng)管理:
1、有可能會(huì)添加很多配置及系統(tǒng)依賴框架厂榛,繁瑣易錯(cuò);
2丽惭、如果框架升級(jí)了击奶,需要替換本地工程里面的框架,再重新配置责掏。

Cocopods管理:
快速柜砾、自動(dòng)集成第三方框架,并編譯成一個(gè)libPod.a的靜態(tài)庫在項(xiàng)目中使用换衬。

  • 1.1痰驱、快速集成+簡(jiǎn)單使用
// 1证芭、初始化pod(會(huì)自動(dòng)生成Podfile等文件)
- pod init

// 2、修改Podfile文件担映,添加需要的第三方
platform :ios, '9.0'
target 'PodUsageDemo' do
  use_frameworks!
  pod 'AFNetworking'
end

// 3废士、下載安裝
- pod install
pod init;生成Podfile文件
修改Podfile文件蝇完,添加需要的第三方
下載安裝完成后的結(jié)構(gòu)

Podfile 是一種規(guī)范,描述了一個(gè)或多個(gè) Xcode 項(xiàng)目的目標(biāo)的依賴關(guān)系

// 1短蜕、根據(jù)不同的target下載不同的第三方代碼
target 'ProjectName' do
  pod 'AFNetworking'
  pod 'SDWebImage'
end

target 'NotificationService' do
  pod 'GTExtensionSDK', '2.2.4'
end


// 2氢架、版本控制
pod 'AFNetworking'           # 使用最新版本
pod 'AFNetworking', '3.0.0'  # 只使用3.0.0版本

除了沒有版本或特定版本之外,還可以使用邏輯運(yùn)算符:
pod 'AFNetworking', '> 0.1'  # 任何高于 0.1 的版本
pod 'AFNetworking', '>= 0.1' # 0.1 版及更高版本
pod 'AFNetworking', '< 0.1'  # 任何低于 0.1 的版本
pod 'AFNetworking', '<= 0.1' # 版本 0.1 和任何更低版本

除了邏輯運(yùn)算符之外朋魔,CocoaPods 還有一個(gè)樂觀運(yùn)算符~>:
pod 'AFNetworking', '~> 0.1.2 ' # 0.1.2 及 0.2 及以下版本岖研,不包括 0.2 及更高版本
pod 'AFNetworking', '~> 0.1'    # 0.1 及 1.0 以下的版本,不包括 1.0 及更高版本
pod 'AFNetworking', '~> 0'      # 版本 0 和 1.0 之前的版本警检,不包括 1.0 及更高版本


// 3孙援、使用本地文件夾路徑(通常用于本地庫,一般建議采用相對(duì)路徑解滓,避免重新配置)
pod 'AFNetworking', :path => '~/Documents/AFNetworking' # 絕對(duì)路徑
pod 'AFNetworking', :path => '../AFNetworking'          # 相對(duì)路徑


// 4赃磨、使用遠(yuǎn)程索引庫的地址
# 使用遠(yuǎn)程地址
pod 'AFNetworking', :git => 'https://github.com/AFNetworking/AFNetworking.git'
# 使用遠(yuǎn)程地址 + 'dev'分支
pod 'AFNetworking', :git => 'https://github.com/AFNetworking/AFNetworking.git', :branch => 'dev'
# 使用遠(yuǎn)程地址 + 'tag'標(biāo)簽
pod 'AFNetworking', :git => 'https://github.com/AFNetworking/AFNetworking.git', :tag => '3.1.1'
# 使用遠(yuǎn)程地址 + 'commit'提交記錄
pod 'AFNetworking', :git => ''https://github.com/AFNetworking/AFNetworking.git', :commit => '0f506b1c45'
何時(shí)使用

pod install :添加邻辉、刪除pod的時(shí)候(即使工程中已經(jīng)存在Podfile或者已經(jīng)執(zhí)行過pod install)
pod update [#PODNAME] :僅在要將pod 更新到較新版本時(shí)使用

主要區(qū)別場(chǎng)景

在Podfile文件內(nèi)的框架版本描述中,有沒有制定具體版本

pod --help
+ install   Install project dependencies according to versions from a Podfile.lock
+ update    Update outdated project dependencies and create new Podfile.lock


1腮鞍、pod install
- 第一次在工程中使用pods時(shí)值骇、每次編輯Podfile文件(新增、移除移国、更新)時(shí)使用吱瘩;
- 每次執(zhí)行pod install時(shí),除了下載安裝迹缀,還會(huì)在Podfile.lock文件夾中生成版本信息使碾,用于跟蹤和鎖定該版本;
- Podfile.lock祝懂,在第一次運(yùn)行pod install后生成的票摇,記錄每個(gè)安裝庫的版本號(hào),并且鎖定了這些版本砚蓬;
- 對(duì)于在Podfile.lock中記錄的版本矢门,該命令會(huì)直接下載安裝,不會(huì)去檢查是否有新的版本;
- 對(duì)于不在Podfile.lock里面的庫祟剔,執(zhí)行該命令后會(huì)從Podfile文件的信息中查找對(duì)應(yīng)版本隔躲。


2、pod update
- pod update參照Podfile安裝物延,如果Podfile中沒有做版本限制宣旱,會(huì)直接將第三方庫升級(jí)為最新的
- 只關(guān)心Podfile中的版本限制,不考慮Podfile.lock里面的限制
- 如果只運(yùn)行pod update教届,后面沒有跟庫的名字响鹃,CocoaPods就會(huì)更新Podfile里面所有的庫到最新版本


3、pod outdated
- 會(huì)列出所有較Podfile.lock里面有新版本的庫(一般用于更新前檢查)


4案训、提升安裝速度
輸入pod install或者pod update之后买置,
- CocoaPods首先會(huì)去匹配本地spec庫;
- 在確認(rèn)spec庫不需要更新之后强霎,才會(huì)下載相應(yīng)的庫文件忿项;
- 這樣比較耗時(shí),可使用以下命令城舞,跳過spec版本庫更新匹配

pod update --verbose --no-repo-update
pod install --verbose --no-repo-update


5轩触、約定俗稱的規(guī)則
- 提交代碼時(shí),省略Pod文件家夺,其他人克隆源碼后直接執(zhí)行pod install脱柱,可節(jié)省遠(yuǎn)程倉庫存儲(chǔ)空間
- 一般添加pod的時(shí)候都會(huì)指明版本(防止其他人誤更新)
- 關(guān)于升級(jí):除非組內(nèi)一起升級(jí),保持版本同步才會(huì)執(zhí)行pod update拉馋,否則只執(zhí)行pod install
  • 1.4榨为、pod search xxxx
- 檢索第三方框架
- 內(nèi)部做的事情:從本地緩存的‘第三方框架描述信息’(.json)生成的檢索文件中檢索到相關(guān)框架信息
- 常見問題:檢索不到,刪除cocopods索引文件煌茴,rm ~/Library/Cache/...search_index.json
  • 搜索失敗及解決
    [!] Unable to find a pod with name, author, summary, or description matching LeeButtonLayout
    1随闺、刪除search_index.json
    2、執(zhí)行如下代碼
pod repo remove master
cd ~/.cocoapods/repos
git clone --depth 1 https://github.com/CocoaPods/Specs.git master
rm ~/Library/Caches/CocoaPods/search_index.json
pod search LeeButtonLayout
  • 1.5蔓腐、pod setup
將遠(yuǎn)程索引庫克隆到本地索引庫
  • 1.6矩乐、名詞解釋
- 遠(yuǎn)程索引庫:https://github.com/CocoaPods/Specs
- 本地索引庫:/Users/qiangzhi/.cocoapods/repos/master/Specs
- 本地索引庫檢索文件:/Users/qiangzhi/Library/Caches/CocoaPods/search_index.json


第三方源碼,第二次安裝特別快回论,就是因?yàn)橐呀?jīng)緩存到本地了散罕,位置(/Users/qiangzhi/Library/Caches/CocoaPods/Pods)

如果刪除search_index.json索引文件后,執(zhí)行pod search xx 會(huì)重新生成search_index.json傀蓉,需要幾分鐘
pod search笨使;如果刪除再搜索的時(shí)候,生成索引文件僚害,等待7-8分鐘

二、pod庫的制作(以制作LeeButtonLayout為例)

pod庫制作.jpeg

制作步驟

  • 從模版庫創(chuàng)建工程 (pod lib create LeeButtonLayout
  • 將代碼添加到 Classes 文件夾中
  • 修改.podspec配置文件
  • 將代碼上傳到GitHub遠(yuǎn)程倉庫,并且打好標(biāo)簽
  • pod驗(yàn)證
  • .podspec文件發(fā)布到公有庫中(trunk方式)
  • 更新本地pod第三方框架信息數(shù)據(jù)源
  • 2.1萨蚕、從模版庫創(chuàng)建工程
// 創(chuàng)建一個(gè)文件夾(例:remoteLib)靶草,從終端進(jìn)入,執(zhí)行以下命令岳遥,LeeButtonLayout就是庫的名稱
pod lib create LeeButtonLayout
// 你想在什么平臺(tái)使用奕翔??(由于是制作移動(dòng)端的庫浩蓉,所以輸入iOS)
What platform do you want to use?? [ iOS / macOS ]
 > iOS

// 你想使用什么語言派继??(我制作的庫是使用ObjectC開發(fā)捻艳,所以輸入ObjC)
What language do you want to use?? [ Swift / ObjC ]
 > ObjC

// 您想在庫中包含演示應(yīng)用程序嗎驾窟?(輸入Yes懂酱,制作完成時(shí)會(huì)自動(dòng)創(chuàng)建一個(gè)Example文件叉弦,里面是使用demo)
Would you like to include a demo application with your library? [ Yes / No ]
 > Yes

// 您將使用哪些測(cè)試框架渠欺?(暫無)
Which testing frameworks will you use? [ Specta / Kiwi / None ]
 > None

// 你想做基于視圖的測(cè)試嗎搏嗡?(暫無)
Would you like to do view based testing? [ Yes / No ]
 > No

// 類前綴
What is your class prefix?
 > Lee


??過程如下圖所示
從模版庫創(chuàng)建工程-圖示
資源文件
代碼文件
Demo
修改代碼

回到Example文件夾下震放,執(zhí)行pod install码倦,進(jìn)行代碼測(cè)試

  • 2.2盛垦、修改.podspec配置文件
WechatIMG222.jpeg
  • 2.3氯庆、將代碼上傳到GitHub遠(yuǎn)程倉庫纪蜒,并且打好標(biāo)簽
// 1衷恭、在github上創(chuàng)建好遠(yuǎn)程倉庫,拿到遠(yuǎn)程倉庫地址

// 2纯续、初始化git随珠、并關(guān)聯(lián)推送到遠(yuǎn)程倉庫
qiangzhi@qiangzhideMacBook-Pro LeeButtonLayout %  git init
qiangzhi@qiangzhideMacBook-Pro LeeButtonLayout %  git add .
qiangzhi@qiangzhideMacBook-Pro LeeButtonLayout %  git commit -m "first commit"
qiangzhi@qiangzhideMacBook-Pro LeeButtonLayout %  git branch -M master
qiangzhi@qiangzhideMacBook-Pro LeeButtonLayout %  git remote add origin https://github.com/leeqiangzi/LeeButtonLayout.git
qiangzhi@qiangzhideMacBook-Pro LeeButtonLayout %  git push -u origin master

// 3、添加tag并推送到遠(yuǎn)程倉庫
qiangzhi@qiangzhideMacBook-Pro LeeButtonLayout %  git tag '0.1.0'
qiangzhi@qiangzhideMacBook-Pro LeeButtonLayout %  git push --tags

??GitHub密碼驗(yàn)證的支持在2021年8月13日之后就不支持了杆烁,需要配置ssh/token牙丽,可參考-《筆記-關(guān)于GitHub的操作》

  • 2.4、pod驗(yàn)證(本地+遠(yuǎn)程)
// 驗(yàn)證本地庫
qiangzhi@qiangzhideMacBook-Pro LeeButtonLayout % pod lib lint

// 驗(yàn)證遠(yuǎn)程庫
qiangzhi@qiangzhideMacBook-Pro LeeButtonLayout % pod spec lint

二者主要區(qū)別:本地驗(yàn)證兔魂,不會(huì)驗(yàn)證tag
本地驗(yàn)證成功
遠(yuǎn)程驗(yàn)證成功
// 1、注冊(cè)賬戶(郵箱+姓名+描述)
- pod trunk register 601623654@qq.com 'leeqiangzi' --description='LeeButtonLayout的配置文件' 

// 2析校、打開郵箱构罗,通過郵件內(nèi)容驗(yàn)證section

// 3、推送到遠(yuǎn)程
- pod trunk push LeeButtonLayout.podspec

執(zhí)行結(jié)果

// 執(zhí)行打印結(jié)果
Updating spec repo `trunk` // 這一步在更新本地索引庫
Validating podspec
 -> LeeButtonLayout (0.1.0)
    - NOTE  | xcodebuild:  note: Using new build system
    - NOTE  | xcodebuild:  note: Using codesigning identity override: -
    - NOTE  | xcodebuild:  note: Build preparation complete
    - NOTE  | [iOS] xcodebuild:  note: Planning
    - NOTE  | [iOS] xcodebuild:  note: Building targets in dependency order

Updating spec repo `trunk`

--------------------------------------------------------------------------------
 ??  Congrats

 ??  LeeButtonLayout (0.1.0) successfully published
 ??  January 31st, 05:38
 ??  https://cocoapods.org/pods/LeeButtonLayout
 ??  Tell your friends!
--------------------------------------------------------------------------------

查看自己是否注冊(cè)過trunk

qiangzhi@qiangzhideMacBook-Pro LeeButtonLayout % pod trunk me

  - Name:     leeqiangzi
  - Email:    601623654@qq.com
  - Since:    January 31st, 05:33
  - Pods:
    - LeeButtonLayout
  - Sessions:
    - January 31st, 05:33 - June 8th, 18:59. IP: 43.239.85.131 Description:
    LeeButtonLayout的配置文件
  • 2.6智玻、pod升級(jí)(子庫拆分+依賴)
pod升級(jí)過程

1遂唧、修改升級(jí)代碼,提交到遠(yuǎn)程倉庫吊奢,更新tag
2盖彭、修改spec文件,trunk方式提交

依賴于其他庫
子庫
// 升級(jí)結(jié)果
qiangzhi@qiangzhideMacBook-Pro LeeButtonLayout % pod trunk push LeeButtonLayout.podspec
Updating spec repo `trunk`
Validating podspec
 -> LeeButtonLayout (0.2.0)
    - NOTE  | xcodebuild:  note: Using new build system
    - NOTE  | xcodebuild:  note: Using codesigning identity override: -
    - NOTE  | xcodebuild:  note: Build preparation complete
    - NOTE  | [iOS] xcodebuild:  note: Planning
    - NOTE  | [iOS] xcodebuild:  note: Building targets in dependency order
    - NOTE  | [iOS] xcodebuild:  Pods.xcodeproj: warning: The iOS Simulator deployment target 'IPHONEOS_DEPLOYMENT_TARGET' is set to 8.0, but the range of supported deployment target versions is 9.0 to 15.2.99. (in target 'AFNetworking' from project 'Pods')
    - NOTE  | [iOS] xcodebuild:  Pods.xcodeproj: warning: MobileCoreServices has been renamed. Use CoreServices instead. (in target 'AFNetworking' from project 'Pods')

Updating spec repo `trunk`

--------------------------------------------------------------------------------
 ??  Congrats

 ??  LeeButtonLayout (0.2.0) successfully published
 ??  February 6th, 03:40
 ??  https://cocoapods.org/pods/LeeButtonLayout
 ??  Tell your friends!
--------------------------------------------------------------------------------

三、遠(yuǎn)程私有庫

遠(yuǎn)程私有庫

與發(fā)布到pod上的主要區(qū)別
1召边、需要兩個(gè)遠(yuǎn)程倉庫(代碼倉庫 + spec倉庫)
2铺呵、需要配置源路徑,Podfile需要添加 source 'xxx'
3隧熙、推送配置文件使用pod repo push xxx xxx.podspec片挂,不再使用trunk方式

其他步驟與 ‘二、pod庫的制作’ 基本一致贞盯,此方法一般用于公司內(nèi)部組件化開發(fā)使用

  • 3.1音念、創(chuàng)建遠(yuǎn)程代碼倉庫 + 遠(yuǎn)程配置倉庫
代碼倉庫 + 配置倉庫
  • 3.2、從模版庫創(chuàng)建工程
WechatIMG242.jpeg
  • 3.3躏敢、將代碼添加到Classes文件中
替換文件
  • 3.4闷愤、在Example文件夾下執(zhí)行pod install,進(jìn)行代碼編譯測(cè)試
  • 3.5父丰、修改spec配置文件
    WechatIMG245.jpeg
  • 3.6肝谭、將代碼提交到遠(yuǎn)程倉庫,添加tag
// 初始化git蛾扇、關(guān)聯(lián)遠(yuǎn)程倉庫攘烛、推送代碼
qiangzhi@qiangzhideMacBook-Pro LeeLimitInput % git init
qiangzhi@qiangzhideMacBook-Pro LeeLimitInput % git add .
qiangzhi@qiangzhideMacBook-Pro LeeLimitInput % git commit -m 'first commit'
qiangzhi@qiangzhideMacBook-Pro LeeLimitInput % git remote add origin https://e.coding.net/leeqiangzi/PrivatePods/LeeLimitInput.git
qiangzhi@qiangzhideMacBook-Pro LeeLimitInput % git push origin master

// 添加標(biāo)簽并推送
qiangzhi@qiangzhideMacBook-Pro LeeLimitInput % git tag '0.1.0'
qiangzhi@qiangzhideMacBook-Pro LeeLimitInput % git push --tags
  • 3.7、驗(yàn)證(本地+遠(yuǎn)程)
本地驗(yàn)證
遠(yuǎn)程驗(yàn)證
  • 3.8镀首、推送配置文件
1坟漱、添加源地址
pod repo add LeeLimitInput https://e.coding.net/leeqiangzi/PrivatePods/LeeLimitInputSpecs.git

2、將spec推送到遠(yuǎn)程
pod repo push LeeLimitInput LeeLimitInput.podspec

??如果名稱寫錯(cuò)可通過 pod repo remove xxx 刪除
這個(gè)過程是:先添加到本地配置庫更哄,再推送到遠(yuǎn)程倉庫
遠(yuǎn)程配置倉庫展示推送后的結(jié)果-0.1.0
  • 3.9芋齿、修改Podfile(添加source),執(zhí)行pod install
# 如果不添加source成翩,則直接到pod的master中查找
# 通過pod repo查看source
source 'https://e.coding.net/leeqiangzi/PrivatePods/LeeLimitInputSpecs.git'
# 公有庫源添加
source 'https://github.com/CocoaPods/Specs.git'

platform :ios, '9.0'

target 'PodUsageDemo' do
  use_frameworks!
  
  pod 'LeeLimitInput'

end

其他參考文檔

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末麻敌,一起剝皮案震驚了整個(gè)濱河市栅炒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌术羔,老刑警劉巖赢赊,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異级历,居然都是意外死亡释移,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門寥殖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來玩讳,“玉大人涩蜘,你說我怎么就攤上這事⊙浚” “怎么了皱坛?”我有些...
    開封第一講書人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)豆巨。 經(jīng)常有香客問我,道長(zhǎng)掐场,這世上最難降的妖魔是什么往扔? 我笑而不...
    開封第一講書人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮熊户,結(jié)果婚禮上萍膛,老公的妹妹穿的比我還像新娘。我一直安慰自己嚷堡,他們只是感情好蝗罗,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蝌戒,像睡著了一般串塑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上北苟,一...
    開封第一講書人閱讀 51,155評(píng)論 1 299
  • 那天桩匪,我揣著相機(jī)與錄音,去河邊找鬼友鼻。 笑死傻昙,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的彩扔。 我是一名探鬼主播妆档,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼虫碉!你這毒婦竟也來了贾惦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤蔗衡,失蹤者是張志新(化名)和其女友劉穎纤虽,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绞惦,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡逼纸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了济蝉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片杰刽。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡菠发,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出贺嫂,到底是詐尸還是另有隱情滓鸠,我是刑警寧澤,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布第喳,位于F島的核電站糜俗,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏曲饱。R本人自食惡果不足惜悠抹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望扩淀。 院中可真熱鬧楔敌,春花似錦、人聲如沸驻谆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽胜臊。三九已至勺卢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間区端,已是汗流浹背值漫。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留织盼,地道東北人杨何。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像沥邻,于是被迫代替她去往敵國(guó)和親危虱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容