Cocoa平臺(tái)的工具鏈

從最開始的原始播種工具與刀耕火種的開墾方式馆蠕,到現(xiàn)代化的機(jī)械農(nóng)機(jī)和水庫(kù)水壩構(gòu)建灌溉系統(tǒng),隨著工具的演化和基礎(chǔ)設(shè)施的發(fā)展的畴,農(nóng)業(yè)才能支持人類人口爆炸式的增長(zhǎng)末融。
挑戰(zhàn)在于工具和基礎(chǔ)設(shè)施的積累、通用性呜达。
日本從明朝引進(jìn)磨盤谣蠢,改變了面食不能加工的面貌。Ruby語(yǔ)言秉承Prel語(yǔ)言的精神查近,誕生了與CPAN(Prel擁有龐大的難以想象的第三方庫(kù)代碼眉踱,CPAN則是較早處理語(yǔ)言內(nèi)部代碼引用和依賴的包管理器)精髓一致的RubyGem,無(wú)數(shù)受到Unix文化熏陶的程序員??方便的將以前的社區(qū)積累的代碼庫(kù)與工具集轉(zhuǎn)移到讓他們感覺舒適的Ruby社區(qū)霜威,Ruby社區(qū)借助工具和基礎(chǔ)設(shè)施轉(zhuǎn)移的優(yōu)勢(shì)谈喳,Ruby on rails迅速成為最火熱的Web技術(shù)棧。在以前戈泼,Cocoa平臺(tái)的開發(fā)者像是最初使用Mac的小眾人群婿禽,隨著移動(dòng)互聯(lián)網(wǎng)時(shí)代的浪潮來(lái)臨,無(wú)數(shù)開發(fā)者開始關(guān)注并成為Cocoa平臺(tái)的開發(fā)者大猛,甚至有大量的開發(fā)者的職業(yè)生涯的第一個(gè)開發(fā)平臺(tái)就是Cocoa扭倾,當(dāng)然這個(gè)平臺(tái)上的優(yōu)秀開發(fā)者總是擁有其他平臺(tái)優(yōu)秀的開發(fā)經(jīng)驗(yàn)。

什么是工具鏈

什么叫做工具鏈挽绩,編寫程序需要使用編程語(yǔ)言膛壹,但是只有編程語(yǔ)言是不能產(chǎn)出實(shí)際的程序或應(yīng)用的。寫出了文本代碼得經(jīng)過編譯唉堪、鏈接模聋、加殼封裝成可執(zhí)行的文件最終發(fā)布才能夠運(yùn)行在設(shè)備上,開發(fā)環(huán)節(jié)同樣重要唠亚,開發(fā)的時(shí)候debug得需要調(diào)試器链方,語(yǔ)法要提示還有高亮,語(yǔ)法分析器和靜態(tài)分析器提供代碼掃描和分析的支持灶搜,引用系統(tǒng)框架或者是第三方庫(kù)祟蚀、項(xiàng)目復(fù)雜以后管理龐大數(shù)量的代碼,也需要使用庫(kù)管理工具或者是依賴管理工具去解決割卖。移動(dòng)軟件分發(fā)平臺(tái)一般都是應(yīng)用商店模式前酿,如果需要商業(yè)發(fā)布,發(fā)布也需要發(fā)布工具來(lái)完成安全和便捷的發(fā)布流程究珊。到此薪者,前面提到的纵苛,編譯器剿涮、鏈接工具言津、調(diào)試器、靜態(tài)分析器取试、包管理工具和發(fā)布工具等等算作是一門開發(fā)語(yǔ)言或者某一開發(fā)平臺(tái)的工具鏈悬槽,像是一根鏈條從開發(fā)、測(cè)試瞬浓、發(fā)布一整套流程下來(lái)需要參與的工具集初婆。可有人問猿棉,為啥我沒聽說(shuō)過呢磅叛?那是因?yàn)槟闶褂昧薞isual Studio或者是Xcode等等這樣的IDE,IDE其實(shí)已經(jīng)把這些工具標(biāo)準(zhǔn)化組織成一套完整的開發(fā)環(huán)境給開發(fā)者萨赁,這是商業(yè)開發(fā)平臺(tái)的好處弊琴,程序員不需要關(guān)心這些工具問題,但是對(duì)于開源界杖爽,你也總會(huì)聽說(shuō)過諸如GNU工具鏈敲董、Ruby on rails工具集等等,Unix巫師使用vim或者emacs開發(fā)慰安,用GCC編譯腋寨,用GDB調(diào)試,使用makefile來(lái)管理鏈接等等化焕,讓你覺得這一切都好流弊萄窜,本篇文章就粗略的介紹一下Cocoa平臺(tái)下的工具鏈。

展望Cocoa

隨著蘋果引導(dǎo)了移動(dòng)互聯(lián)網(wǎng)時(shí)代锣杂,Cocoa平臺(tái)的新鮮血液越來(lái)越充足脂倦,可這就像是一片貧瘠的土地,亟待開墾元莫,有經(jīng)驗(yàn)的開發(fā)者一邊逐步體味到iOS赖阻、MacOS這類類Unix系統(tǒng)的精髓,并深感由C類語(yǔ)言演化的Objective-C和與GCC一脈相承的Clang踱蠢、LLVM的偉大火欧,但同時(shí)也漸漸發(fā)現(xiàn),落后的代碼管理機(jī)制與C語(yǔ)言也一樣飽受詬病(靜態(tài)庫(kù)組織代碼與缺乏命名空間)茎截,開發(fā)者數(shù)目龐大卻缺乏成熟代碼管理工具與庫(kù)管理平臺(tái)苇侵,使用靜態(tài)庫(kù)與通過submodules來(lái)組織代碼效果也不甚理想,并不能解放開發(fā)者手動(dòng)檢查依賴關(guān)系企锌,相比于Java社區(qū)Ant榆浓、Maven、Gradle的發(fā)展撕攒,Ruby on rails的RubyGem陡鹃,哪怕是JavaScript的Npm與webpack等等烘浦,Cocoa的開發(fā)者工具甚至原始的有一些過分,Android開發(fā)社區(qū)借助Java的力量萍鲸,以intellij商業(yè)開發(fā)工具為基礎(chǔ)闷叉,發(fā)展出以Gradle、Android Studio等開發(fā)工具集脊阴,使得Java開發(fā)者能夠迅速的投入移動(dòng)應(yīng)用的開發(fā)握侧。相比之下,Cocoa平臺(tái)的開發(fā)者在面臨大規(guī)模開發(fā)時(shí)也逐漸暴露許多工程問題嘿期∑非妫“中國(guó)的造紙術(shù)傳入西方,給歐洲大陸帶來(lái)了文明备徐,從此才有了文藝復(fù)興”孽查。在這樣的情況下,在第一批轉(zhuǎn)入Cocoa移動(dòng)開發(fā)社區(qū)的開發(fā)者中坦喘,有一大部分來(lái)自Ruby社區(qū)的開發(fā)者盲再,其中Eloy Durán在2011年8月12日創(chuàng)建了CocoaPods,從而揭開第三方開源社區(qū)構(gòu)建Cocoa平臺(tái)下工具集的序曲瓣铣,CocoaPods已經(jīng)成為Cocoa平臺(tái)下答朋,第三方庫(kù)管理以及代碼管理的事實(shí)標(biāo)準(zhǔn),隨著Swift社區(qū)建立以及開源棠笑,這些已有的工具集又快速的遷移到新的社區(qū)梦碗,使得Swift的社區(qū)在短時(shí)間內(nèi)變得非常活躍且富有生機(jī)蓖救,隨著Swift Package Manager的發(fā)布洪规,至少屬于Apple的Swift開發(fā)團(tuán)隊(duì)開始注重這方面的問題,一切都在向好的方向發(fā)展循捺。

其實(shí)本篇文章是瞎扯淡

為什么這么說(shuō)斩例,因?yàn)閄code已經(jīng)提供了從編譯鏈接到發(fā)布的一切工具,既然能用為什么還要講這些从橘,不是在表演技術(shù)么念赶?還真不是,Xcode雖然好用恰力,但是有如下幾個(gè)小問題叉谜,第一是沒有很好地依賴管理工具,第二是構(gòu)建工具太復(fù)雜踩萎,第三是沒有比較好的發(fā)布工具停局,只有IDE的發(fā)布功能,最后并不能很好的打通這些工具。這有什么影響呢董栽?如果你一直在Xcode下工作履怯,所有的工作需求都是可以通過手動(dòng)操作被滿足的,但是項(xiàng)目規(guī)模一上來(lái)裆泳,諸多的第三方庫(kù)的管理、不停地構(gòu)建和打包分發(fā)給測(cè)試柠硕、發(fā)布到Appstore的時(shí)候總是出現(xiàn)這樣或者那樣的問題工禾,你需要進(jìn)行持續(xù)集成,但總是受制于Xcode蝗柔。
思考如下問題:

  1. 如何避免反復(fù)手動(dòng)給測(cè)試打包
  2. 如何避免反復(fù)手動(dòng)給測(cè)試機(jī)安裝測(cè)試版本App
  3. 當(dāng)出現(xiàn)大規(guī)模并行開發(fā)的時(shí)候闻葵,如何靈活構(gòu)建多種版本,配置多種構(gòu)建環(huán)境癣丧,方面測(cè)試能夠進(jìn)行線上常規(guī)測(cè)試槽畔、灰度發(fā)布測(cè)試、特性分支功能版本測(cè)試胁编、bug修復(fù)版本測(cè)試等等
  4. 當(dāng)出現(xiàn)多個(gè)版本的時(shí)候厢钧,如何對(duì)接bug跟蹤系統(tǒng)
  5. 團(tuán)隊(duì)開發(fā)人員數(shù)量爆發(fā),引入組件化方案后嬉橙,主工程如何管理各個(gè)發(fā)開團(tuán)隊(duì)負(fù)責(zé)的功能模塊
  6. 如何做到代碼版本控制工具->代碼審查合并->觸發(fā)構(gòu)建觸發(fā)器->配置構(gòu)建環(huán)境->構(gòu)建打包->分發(fā)測(cè)試
  7. 如何構(gòu)建私有代碼共享倉(cāng)庫(kù)

Cocoa平臺(tái)下的工具鏈

在工作中早直,個(gè)人覺得Cocoa平臺(tái)比較缺乏完整的商業(yè)工具鏈,但借助Ruby on rails社區(qū)的力量發(fā)展了一大批開源項(xiàng)目豐富了Cocoa平臺(tái)的工具鏈市框,至少包含如下幾項(xiàng):

  1. Xcodebuild
  2. oclint
  3. sonar
  4. bundle
  5. fastlane
  6. CocoaPods
  7. carthage
  8. shenzhen

xcodebuild

Xcodebuild屬于構(gòu)建工具霞扬,是Xcode構(gòu)建功能的命令行版本,官方的 Man-page
該命令行工具可以通過project文件或者是workspace文件枫振,指定target喻圃、scheme、buildconfiguration等等來(lái)進(jìn)行編譯粪滤,同時(shí)可以指定編譯后的文件輸出路徑等等斧拍,作為基礎(chǔ)的命令行工具,可以不適用Xcode工具進(jìn)行編譯打包等等杖小,xcrun又可以提供Xcode一系列完整的工具鏈調(diào)用饮焦,在實(shí)際開發(fā)過程中,有以下幾種使用情況:

  • 編譯完整應(yīng)用的項(xiàng)目窍侧,進(jìn)行命令行構(gòu)建與打包县踢,成為持續(xù)集成的基礎(chǔ)工具,當(dāng)然也要求CI服務(wù)器必須是MacOS環(huán)境
  • 如果代碼使用動(dòng)態(tài)庫(kù)或者靜態(tài)庫(kù)管理和組織伟件,團(tuán)隊(duì)內(nèi)部有這樣的共享代碼需求或者你從事的是SDK開發(fā)硼啤,可使用該工具進(jìn)行動(dòng)態(tài)配置,比如使用scheme與build configuration編譯斧账,同一套代碼可編譯出不同配置的代碼庫(kù)
  • 編譯資源bundle工程谴返,如果項(xiàng)目?jī)?nèi)部的資源使用bundle進(jìn)行組織的煞肾,則使用該工具可以靈活控制資源bundle的產(chǎn)出,并與其他工具交互嗓袱,分發(fā)給不同的開發(fā)人員或項(xiàng)目

CocoaPods與Carthage依賴管理工具

Carthage

CocoaPods

準(zhǔn)確的來(lái)說(shuō)籍救, CocoaPodsCarthage 并不是完全同一類型的工具,CocoaPods涉及到第三方庫(kù)的管理渠抹、發(fā)布甚至帶有構(gòu)建中心代碼倉(cāng)庫(kù)的功能蝙昙,相比之下Carthage簡(jiǎn)簡(jiǎn)單單是第三方庫(kù)引用管理的工具,遠(yuǎn)遠(yuǎn)沒有CocoaPods強(qiáng)大梧却,但其去中心化與不破壞工程結(jié)構(gòu)的做法奇颠,使得應(yīng)付小型項(xiàng)目得心應(yīng)手。Podfile用以申明項(xiàng)目代碼相關(guān)性放航,Cocoapods用來(lái)處理各庫(kù)之間的依賴關(guān)系烈拒,可以自動(dòng)下載配置好所需要的庫(kù),即便是在管理自己書寫的代碼的相關(guān)系上广鳍,Cocoapods也是最好的選擇荆几,使用CocoaPods有如下情況:

  • 管理工程中的第三方庫(kù)
  • 管理團(tuán)隊(duì)開發(fā)代碼的相關(guān)性
  • 將書寫的代碼復(fù)用,采取制作成Pod庫(kù)的形式赊时,引用其他模塊的代碼也是Pod庫(kù)伴郁,這樣可以通過Podfile管理內(nèi)部代碼依賴關(guān)系,從而避免庫(kù)沖突等等復(fù)雜問題
  • 構(gòu)建組織內(nèi)部的代碼倉(cāng)庫(kù)蛋叼,用作組織內(nèi)部代碼發(fā)布焊傅、測(cè)試與共享管理
  • 每個(gè)團(tuán)隊(duì)都把自己負(fù)責(zé)的模塊代碼以Pod形式提供,模塊內(nèi)代碼發(fā)生變化狈涮,則必須通過更新版本號(hào)發(fā)布新版本狐胎,主工程可以方面測(cè)試,一旦出現(xiàn)嚴(yán)重問題則可以回退到之前穩(wěn)定的版本歌馍,從而保證主工程的可壯性

oclint靜態(tài)分析工具

oclint是一個(gè)開源的靜態(tài)分析工具握巢,在MacOS中基于Clang進(jìn)行C、C++松却、Objective-C的靜態(tài)分析暴浦,目的在于可以發(fā)現(xiàn)代碼隱藏的問題和提高代碼質(zhì)量,如果公司沒有codeReview的習(xí)慣的話晓锻,經(jīng)常使用靜態(tài)分析可以稍微彌補(bǔ)一下歌焦,大體上oclint可以做到如下:

  • 掃描隱形bug,諸如if else邏輯沒有完整砚哆,異常沒有處理等語(yǔ)句的分析
  • 掃描沒有使用過的代碼独撇,包含未使用的變量和參數(shù)
  • 掃描不符合設(shè)置的語(yǔ)法風(fēng)格,比如方法命名規(guī)范與代碼包裝邏輯規(guī)范等等
  • 掃描復(fù)雜邏輯代碼,檢查是否有邏輯重疊或者檢查循環(huán)調(diào)用等
    在Cocoa平臺(tái)下纷铣,組織持續(xù)集成卵史,實(shí)施持續(xù)交付的過程中,通過每次代碼提交入庫(kù)的時(shí)候搜立,進(jìn)行靜態(tài)分析掃描以躯,可以將質(zhì)量問題在交付測(cè)試之前就及時(shí)發(fā)現(xiàn),開發(fā)者可以使用這些工具提前將bug扼殺在搖籃中啄踊。比如忧设,在每次git代碼提交入庫(kù),從分支完成以后可以使用oclint進(jìn)行靜態(tài)分析社痛,生成html的代碼報(bào)告,可以設(shè)置質(zhì)量閾值來(lái)根據(jù)分析結(jié)果是否將提交回滾命雀,重新打回開發(fā)階段蒜哀。

shenzhen與fastlane構(gòu)建工具



shenzhen是一個(gè)使用Xcode API的命令行構(gòu)建工具,fastlane則是一套兼容Android與iOS移動(dòng)端的持續(xù)集成工具集吏砂,相比于shenzhen撵儿,構(gòu)建工具只是fastlane中一個(gè)非常小的子集。fastlane有如下幾個(gè)套件:

  • scan插件狐血,用以運(yùn)行單元測(cè)試代碼淀歇,在構(gòu)建之前通過單元測(cè)試再開始進(jìn)行構(gòu)建,這對(duì)于模塊代碼的穩(wěn)定性至關(guān)重要匈织,也許一些開發(fā)者會(huì)比較喜歡Mock測(cè)試浪默,但面對(duì)UI測(cè)試和邏輯單元測(cè)試,使用UITest與XCTestCase則會(huì)更加有效缀匕,scan則可以與這些測(cè)試框架進(jìn)行交互纳决,并生成測(cè)試報(bào)告
  • pilot插件,用以綁定測(cè)試分發(fā)服務(wù)乡小,比如iOS構(gòu)建的版本可以通過它推送到testFlight阔加,測(cè)試設(shè)備就可以自動(dòng)獲得測(cè)試版本
  • gym插件,用以替代shenzhen满钟,可以構(gòu)建打包應(yīng)用
  • deliver插件胜榔,可以用以發(fā)布應(yīng)用到AppStore
  • 還有諸如cert管理證書和配置文件,snapshot管理上傳到AppStore的截圖湃番,pem管理推送配置文件夭织,produce通過命令行與iTunes Connect進(jìn)行交互,match用以管理和同步配置文件和證書
    fastlane這樣的構(gòu)建工具已經(jīng)比較完整的覆蓋了Cocoa平臺(tái)下有關(guān)移動(dòng)開發(fā)的工具范圍

SonarQube


SonarQube是一個(gè)代碼質(zhì)量管理的開源平臺(tái)吠撮,可用于搭建代碼質(zhì)量管理服務(wù)器摔癣,通過在服務(wù)器上構(gòu)建應(yīng)用,運(yùn)行代碼靜態(tài)分析偵測(cè)代碼質(zhì)量、運(yùn)行單元測(cè)試進(jìn)行全面的回歸測(cè)試择浊、搜索重復(fù)代碼戴卜、評(píng)估單元測(cè)試覆蓋率、通過設(shè)置代碼規(guī)范檢測(cè)代碼風(fēng)格琢岩、檢索注釋評(píng)估代碼閱讀性投剥、發(fā)現(xiàn)潛在的bug生成評(píng)估報(bào)告。
其實(shí)該平臺(tái)本身不屬于Cocoa平臺(tái)下的特有工具担孔,但一般來(lái)說(shuō)江锨,Cocoa工具鏈中包含的構(gòu)建、測(cè)試和代碼分析工具組合起來(lái)就是簡(jiǎn)單的代碼質(zhì)量管理糕篇,sonar是一個(gè)質(zhì)量管理平臺(tái)啄育,可以在服務(wù)器上搭建,可以利用這些工具在管理平臺(tái)上專門針對(duì)Cocoa項(xiàng)目的進(jìn)行代碼評(píng)估與質(zhì)量管理拌消,方便從質(zhì)量控制這一維度管理項(xiàng)目挑豌。

目標(biāo)

事實(shí)上,上述工具的介紹都隱隱約約指向一個(gè)目標(biāo)—持續(xù)交付墩崩,也許在項(xiàng)目復(fù)雜度還較低的情況下氓英,過早的引入軟件工程開發(fā)的方法論還為時(shí)尚早,但開發(fā)者應(yīng)該預(yù)見未來(lái)項(xiàng)目的規(guī)模增長(zhǎng)趨勢(shì)鹦筹,根據(jù)業(yè)務(wù)需求增長(zhǎng)水平铝阐,適時(shí)引入敏捷開發(fā)或者是Devops這樣的開發(fā)模式或者方法論,工具是開發(fā)流程實(shí)施的基礎(chǔ)設(shè)施铐拐,回答最初那幾個(gè)開發(fā)實(shí)際過程中出現(xiàn)的問題徘键,基礎(chǔ)的工具可以實(shí)現(xiàn)持續(xù)交付,提高開發(fā)遍蟋、測(cè)試啊鸭、運(yùn)維與QA等部門之間的合作效率,使得出現(xiàn)的諸如交付測(cè)試匿值、代碼質(zhì)量管理赠制、發(fā)布流程自動(dòng)化等等得以實(shí)現(xiàn),從而高效的完成工作

fastlane存在的問題

1.出現(xiàn)編碼不匹配的問題

[!] incompatible character encodings: US-ASCII and UTF-8 (Encoding::CompatibilityError)

解決方法:
首先在shell中查看環(huán)境變量
$ env | grep -e 'LANG'查看是否有LANG環(huán)境變量值是否為utf8挟憔,如果沒有或者不是钟些,則在~/.bash_profile中加入如下內(nèi)容:

export LC_ALL=en_US.UTF-8  
export LANG=en_US.UTF-8

最后在$ source ~/.bash_profile重新啟動(dòng)文件夾

2.使用CocoaPods管理第三方依賴以后,增加build configuration出現(xiàn)

clang: error: linker command failed with exit code 1 (use -v to see invocation)

查看編譯出錯(cuò)的報(bào)告往往是找不到pod編譯后的庫(kù)绊谭,因?yàn)樾略黾恿艘粋€(gè)build configuration以后政恍,編譯后的路徑就發(fā)生改變,這時(shí)候达传,你可以把Podfile文件的所有第三方庫(kù)引用都注釋掉篙耗,執(zhí)行pod install然后再把注釋取消迫筑,繼續(xù)pod install

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市宗弯,隨后出現(xiàn)的幾起案子脯燃,更是在濱河造成了極大的恐慌,老刑警劉巖蒙保,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辕棚,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡邓厕,警方通過查閱死者的電腦和手機(jī)逝嚎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)详恼,“玉大人补君,你說(shuō)我怎么就攤上這事∶粱ィ” “怎么了挽铁?”我有些...
    開封第一講書人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)硅堆。 經(jīng)常有香客問我屿储,道長(zhǎng)贿讹,這世上最難降的妖魔是什么渐逃? 我笑而不...
    開封第一講書人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任谎柄,我火速辦了婚禮焕议,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘抠蚣。我一直安慰自己赊堪,他們只是感情好面殖,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著哭廉,像睡著了一般脊僚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上遵绰,一...
    開封第一講書人閱讀 51,578評(píng)論 1 305
  • 那天辽幌,我揣著相機(jī)與錄音,去河邊找鬼椿访。 笑死乌企,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的成玫。 我是一名探鬼主播加酵,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼拳喻,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了猪腕?” 一聲冷哼從身側(cè)響起冗澈,我...
    開封第一講書人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎码撰,沒想到半個(gè)月后渗柿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡脖岛,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年朵栖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片柴梆。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡陨溅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出绍在,到底是詐尸還是另有隱情门扇,我是刑警寧澤,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布偿渡,位于F島的核電站臼寄,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏溜宽。R本人自食惡果不足惜吉拳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望适揉。 院中可真熱鬧留攒,春花似錦、人聲如沸嫉嘀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)剪侮。三九已至拭宁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間瓣俯,已是汗流浹背杰标。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留降铸,地道東北人在旱。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像推掸,于是被迫代替她去往敵國(guó)和親桶蝎。 傳聞我的和親對(duì)象是個(gè)殘疾皇子驻仅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,144評(píng)論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件登渣、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,104評(píng)論 4 62
  • 小小的你噪服,頭頂有一片大大的天,身后是一叢綠綠的樹胜茧,眼前是一群白白的羊…… 這也許是我的從前粘优,也許...
    蘇沐笙閱讀 199評(píng)論 0 0
  • 最近沒有新鮮的故事,於是連標(biāo)題都不知如何下筆呻顽。聊天的情形多半是傾聽雹顺,自己並沒有什麼特別需要說(shuō)明的故事和瑣碎。每天的...
    林夕草右閱讀 238評(píng)論 0 0
  • 今晚意大利贏了西班牙廊遍,朋友圈里好多人都說(shuō)不用再看球了嬉愧。 我不是球迷,也不懂足球喉前,不過今天看到一個(gè)關(guān)于冰島隊(duì)的段子没酣,...
    隨風(fēng)而逝711閱讀 306評(píng)論 0 0