项目依赖管理学习笔记

在开发的过程中,我们经常要使用(依赖)其他第三方库,而这些库或框架还有可能依赖于其他的第三方库和框架,这样就会形成一个复杂的依赖关系网,而手动管理这些库或框架是非常麻烦的,首先要找到并下载这些库或框架,还要注意版本的兼容性问题,继而把它们添加到当前工程中,还需要配置其相关的环境变量,这些都去手动完成是非常耗费精力的,所幸我们还有依赖管理工具,这将大大减少我们的工作量,CocoaPods和Carthage工具就可以帮助我们完成项目依赖的管理工作。

CocoaPods依赖管理工具

CocoaPods是最有影响力的OS X和IOS项目依赖管理工具,于2011年发布,经过多年的发展,它已经非常完善了,CocoaPods支持项目中采用Objective-C和Swift语言。CocoaPods会将第三方库的源代码编译为静态链接库.a文件或是动态框架.framework文件的形式,并将它们添加到项目中,建立依赖关系。

安装CocoaPods

由于CocoaPods工具是使用Ruby语言开发的,在OS X系统下默认安装了Ruby运行环境,所以不需要另外安装Ruby运行环境了。CocoaPods的下载和安装可以使用Ruby包管理工具gem。

安装流程:

  • 1.在终端中执行:sudo gem install cocoapods
    (如果报错ERROR: Could not find a valid gem 'cocoapods' (>= 0) in any repository,可以尝试执行:sudo gem install cocoapods --source http://rubygems.org)
  • 2.等待安装,当完成时终端输出如图:
屏幕快照 2019-05-25 下午3.50.04.png

注:如果这个命令执行了很长时间但没有反应或出现如下错误:ERROR: Could not find a valid gem 'cocoa pods' (> = 0),here is why: Unable to download data from https://rubygems.org/ - ERROR :Connection reset by peer - SSL_connect (https://rubygems.org/latest_apecs.4.8.gz)这是由于gem工具无法访问默认的Ruby源(rubygems.org),此时我们可以把Ruby源换为国内的镜像源。在终端执行如下命令:

sudo gem source --remove https://rubygems.org/
sudo gem sources -- a http://gems.ruby-china.org/

  • 3.安装指令成功之后还需要进行设置,执行:pod setup
    该指令会在本地创建~/.cocoapods/文件夹,并将CocoaPods的GitHub库(https://github.com/CocoaPods/Specs)下载到该文件夹中。这样当配置依赖关系时,可以直接使用本地文件。由于下载的内容较多(300MB左右),setup执行的时间会表较长,而且容易失败,不过百度上有应对其下载失败的办法。例如这篇:(https://www.jianshu.com/p/b561726ac3fd) 。

然后就可以搜索我们要使用的第三方库了,可以通过网站https://cocoapods.org进行搜索,一个多么朴素的界面:

屏幕快照 2019-05-25 下午10.18.39.png

当然也可以通过pod指令进行搜索,在终端执行:pod search 第三方库名,例如:pod search AFNetworking,结果如图:

屏幕快照 2019-05-25 下午10.28.01.png

当然并不只有这一个库的信息,而是巨多,当然你全名搜索的话,你需要的在第一条,我本来想数数的,结果数乱了,对,我就是这么无聊,找到需要的后,按q退出,我差点直接关了终端你造吗,我果然依旧菜......

接下来就是项目与第三库的搭配了,使用CocoaPods工具管理第三方库时,会将第三方提供的源代码进行编译,而编译的结果有两种形式,分别为静态链接库.a文件和动态框架.framework文件,至于如何选择,就需要看项目中调用第三方库的代码采用何种语言,另外还需要看第三方库采用何种语言。

示例:以动态框架库形式管理依赖

  • 1.通过终端进入项目工程目录下,即*.xcodeproj文件所在的目录,执行 pod init指令。
    例如:
屏幕快照 2019-05-25 下午10.55.02.png
  • 2.该指令执行成功后,会在当前目录下生成一个Podfile文件,该文件是一个文本文件。
屏幕快照 2019-05-25 下午11.00.21.png

这个文本文件的内容是这样的:

屏幕快照 2019-05-25 下午11.03.57.png

然后修改Podfile文件,例如这样:

屏幕快照 2019-05-26 下午8.13.32.png

注:依赖库后面的数值表示依赖版本,它有如下几种表示方式:

=3.1.0, 表示大于等于3.1.0版本。
<=3.1.0, 表示小于等于3.1.0版本。
~>3.1.0, 表示大于等于3.1.0版本,小于下一个主版本,即小于4.0。
3.1.0, 表示大于3.1.0版本。
<3.1.0, 表示小于3.1.0版本。
3.1.0, 表示等于3.1.0版本。

Podfile文件修改完成后,执行pod install指令,就可以安装依赖关系了,安装成功后,目录是这样的:

屏幕快照 2019-05-26 下午8.45.34.png

playPlay.xcworkspace、Podfile.lock、Pods是安装过程中创建的,其中的Pods目录是工程所依赖库或框架源代码工程。如果通过Xcode启动工程,应该通过playPlay.xcworkspace工作空间文件启动,依赖成功后是这样的:

屏幕快照 2019-05-27 上午12.03.00.png

关于pod setup命令报错的处理办法

今天做了个项目,在Podfile中新增了几个第三方,准备pod update/install的时候,发现下面的报错

image

然后赶紧去百度了,网上说先清除下CocoaPods的缓存,于是继续进行

image

删除缓存以后,再次pod update结果继续是一堆的报错

image

然后继续百度上面的报错,说是因为cocoaPods下面没有master文件夹造成的...然后开始使用pod setUp去clone这个文件夹回来,结果多次尝试都是失败告终!

image

那么这个报错原因是什么呢? 怎么解决?由于网上的解决方案太杂太乱,方法步骤没有截图,导致很难使用,于是写下了此文,欢迎各位雅正!
下面,进入今天正题,看看原因和解决方案

失败原因:pod setup的本质就是将https://github.com/CocoaPods/Specs 上的Specs项目clone到~/.cocoapods/repos目录下。若此目录下已有Specs项目,则会将项目更新到最新的状态。由于Specs很大,容易导致pod setup失败。这时就需要我们手动安装Specs。若直接从github上下载zip文件,由于缺少git文件,会导致cocoa pods不使用。

由于直接pod setup用时太久,很容易导致失败,使用 cocoapods 的镜像索引来提高下载速度。这里给出国内的一个镜像索引地址:

https://coding.net/u/hging/p/Specs/git

点击打开以后,我们获得他的git地址,为后面的clone做准备..操作方法截屏如下

image

好了,国内的cocoapods 的镜像索引有了,那么下面我们就来进行相关操作了
1.我们先去~.cocoapods文件去看看

image

你会发现有下面的文件

image

如果有master的话,建议你先删除掉master这个文件夹,因为马上我们下载下来的文件夹,需要该名称master

2.删除master文件以后,我们打开终端,将podspec索引文件clone到本地的~/.cocoapods/repos/master位置
我们先切到~./cocoapods文件夹处

image

然后利用我们上面拿到的git地址clone就可以了

image

后面我们静静的等待就可以了,大概10几分钟可以下载完成

image

再去文件夹里看看,发现master文件夹已经生成了,并且全部文件也已经全部下载下来

image

此时,我们再次 pod update下,更新下我们的第三方库

image

安装完一堆配置文件后,然后自动为我们更新了第三方

image

至此,我们解决了pod setup失败,导致项目中的cocoaPods无法使用的问题。

此段内容摘自D了个Y的简书。

spec资源中不包含某个库的配置文件导致pod install报错

cocoapods安装完成后,会在用户根目录下有个隐藏文件夹,里面存放了cocoapods所收录的库的配置信息。路径如下(使用command + shift + . 可以显示隐藏的文件夹):

截屏2020-09-28下午9.40.09.png
截屏2020-09-28下午10.29.41.png

当执行pod update或pod install的时候,会因为在本地.cocoapods下找不到相应的配置文件而报错,报错如图:

截屏2020-09-28下午5.53.55.png

错误译文:

找不到LookinServer的规范
你可以

  • 过期的源仓库,您可以使用“pod repo update”或“pod install--repo update”更新。
  • 输入名称或版本错误。
  • 未将承载Podspec的源仓库添加到您的podfile。

根据提示,使用pod repo update命令进行更新,pod repo update会更新整个.cocoapods下的所有库,执行如图:

截屏2020-09-28下午5.56.03.png

当pod repo update命令执行成功后,再次执行pod update或pod install命令,完成库的更新:

截屏2020-09-28下午5.56.21.png

如果pod repo update命令执行的时间过长,可以进行选择性的库更新,找到对应库的路径,然后执行更新命令,例如:

截屏2020-09-28下午10.50.33.png
截屏2020-09-28下午9.37.08.png
截屏2020-09-28下午10.53.09.png

pod init 报错error: tool ‘xcodebuild‘ requires Xcode, but active developer directory

Xcode -> Preferences -> Locations 检查如下位置是否选择 :

截屏2022-11-19 10.20.30.png

Xcode14 创建的新项目,无法进行Pod init,报错如下 :

截屏2022-11-19 10.09.55.png

处理办法暂时将Xcode14.0-compatible 更改为 Xcode13.0-compatible,如下:
截屏2022-11-19 10.10.24.png

Carthage依赖管理工具

Carthage是一个轻量级的项目依赖管理工具,主张“去中心化”和“非侵入性”。Cocoapods搭建了一个中心库(cocoapods.org),第三方库被收录到该中心库中,没有收录的第三方库是不能使用Cocoapods管理的,这就是所谓的“中心化”思想,而Carthage没有这样的中心库,第三方库基本上都是从GitHub或私有Git库中下载的,这就是“去中心化”。另外,Cocoapods在下载第三方库后,会将其编译成静态链接库或动态框架文件,然后会修改Xcode项目属性配置依赖关系,这就是“侵入性”。而Carthage下载成功之后,会将第三库编译为动态框架,由开发人员自己配置依赖关系,Carthage不会修改Xcode项目属性,这就是非侵入性。

注:使用Carthage有两个限制:

  • 1.第三库只能编译为框架。
  • 2.IOS项目的版本必须是IOS8以上的版本。

安装Carthage

Carthage工具可以通过两种方式安装,一种是在https://github.com/Carthage/Carthage/releases网站下载已经编译好的安装包Carthage.pkg进行安装。

屏幕快照 2019-05-28 下午10.45.20.png

另一种是通过Homebrew工具安装,Homebrew是用来管理OS X系统下安装包的工具。要确定是否安装了Homebrew工具,可以在终端执行brew update指令,如果没有安装Homebrew工具,终端会提示brew命令无法执行,此时可以在终端中执行如下指令:

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

命令执行成功后,就可以在终端中执行brew install carthage指令进行安装。

Cartfile文件

与CocoaPods的Podfile类似,Carthage使用名为Cartfile的文件描述依赖库,该文件的内容示例如下:

屏幕快照 2019-05-28 下午11.13.50.png

从Carthage文件的内容可见依赖库的来源有Git和GitHub,Git是私有库。git或github是依赖库名或git地址,第1行的Alamofire/Alamofire与第2行的AFNetworking/AFNetworking即为依赖库名,指定依赖库一般指定GitHub上库的"用户名/项目名",这个名字如果不能确定,需要到GitHub上查询确定。

屏幕快照 2019-05-28 下午11.23.34.png

第4行为git地址,支持git所支持的所有协议,如:https、git和ssh等,git库可以创建多个分支,所以可以在Carthage文件中指定分支名,其中第3行与第4行中的"main"都是分支名。有了分支,不需要指定版本号。

与Podfile类似,在Cartfile文件中可以指定依赖库版本,它主要有如下表示方式:
1 == 3.0,表示等于3.0版本。
2 >= 3.0,表示大于等于3.0版本。
3 ~> 3.0,表示大于等于3.0版本,小于下一个主版本,即小于4.0。

Carthage依赖管理示例:
  • 1.首先通过终端进入CarthagePlay工程目录下,即*.xcodeproj文件所在目录,并创建Cartfile文本:
屏幕快照 2019-05-28 下午11.59.19.png
  • 2.将其内容修改如下:
    屏幕快照 2019-05-29 上午12.01.11.png
  • 3.执行Carthage update --platform iOS指令,安装依赖关系:

屏幕快照 2019-05-29 上午12.03.38.png

Carthage update --platform iOS指令的参数platform iOS表示只考虑IOS平台,执行过程分为两个阶段,首先将库下载到本地,然后再使用xcodebuild命令将库编译为框架。

Carthage update --platform iOS指令执行成功后,CarthagePlay工程目录下会多出一个Carthage目录,该目录中又包含了两个目录Build和Checkouts。Build目录中存放编译好的framework文件,根据不同的平台它会包含不同的目录,如Mac、IOS、tvOS和watchOS。

屏幕快照 2019-05-29 上午12.12.42.png

Checkouts目录是下载的第三方库的源代码。

屏幕快照 2019-05-29 上午12.14.21.png

Carthage需要我们自己配置CarthagePlay工程与第三方库的依赖关系:

  • 1.在Xcode工程中打开TARGETS ——> CarthagePlay ——> General,在Linked Frameworks and Libraries中点击 + 按钮,在弹出的对话框中单击Add Other按钮,找到Build目录中的framework文件,添加依赖框架。
屏幕快照 2019-06-08 下午4.59.44.png

添加成功后的目录结构:

屏幕快照 2019-06-08 上午11.13.51.png
  • 2.第三方库添加完成,还需要运行脚本(Run Script)。运行脚本,就是在编译时执行命令。Carthage提供的运行脚本可以将框架复制到运行环境目录下。在Xcode工程中打开TARGETS ——> CarthagePlay ——>Build Phases,如果没有Run Script部分,可以通过菜单Editor ——> Add Build Phase ——> Add Run Script Build Phases菜单项添加。

在Run Script部分的脚本区域输入:

屏幕快照 2019-06-08 下午12.39.13.png
  • 3.尝试进行编译,如果报错如下,可以command+shift+k清空编译缓存重新编译。
屏幕快照 2019-06-08 下午12.46.20.png
  • 4.在项目中引入第三方库的头文件,如果报错如下:
屏幕快照 2019-06-08 下午1.35.38.png

可以尝试在TARGETS——>Build Setting——>Search Paths——>Header Search Paths中将第三方库的头文件文件夹拖入其中。

屏幕快照 2019-06-08 下午1.42.49.png
屏幕快照 2019-06-08 下午1.46.39.png

至此,可以导入第三方库并使用

屏幕快照 2019-06-08 下午1.52.40.png

Carthage更新

因为最近改动了公司封装的工具包项目,而工具包是由Carthage进行管理的,我用SourceTree拉去工具包代码后,进行了代码更改,然后推送到远端并打上了标签,但当我在本地项目执行Carthage update --platform iOS命令之后,运行项目成功的报错了。

截屏2020-03-28下午4.38.40.png

译:请更新到最新的迦太基版本:0.34.0。您当前的版本是0.33.3。

所以我赶快的查看了一下Carthage的版本,果然它说的是对的:

截屏2020-03-28下午6.01.17.png

那就更新一下吧,毕竟报错了(后来我才发现我太天真了,报错的原因根本不是因为版本的原因导致的,但是升级Carthage的过程还是值得记录)。所以我执行了brew upgrade carthage命令进行更新,本想的是万事大吉,不曾想却是当场报错。

截屏2020-03-28下午5.59.40.png

译:您的用户无法写入以下目录:

/usr/local/include
/usr/local/lib
/usr/local/lib/pkgconfig
/usr/local/sbin

您应该将这些目录的所有权更改为您的用户,并确保您的用户具有写权限。

我自己使用的电脑,我为什么没有权限,难道是因为电脑是公司配置的?所以我赶紧去找了一下解决的办法,毕竟我是一个面向百度、谷歌、火狐、对象进行编程的码农。哦,错了,对象没有。一番查找,果然还是找到了解决的办法:

  • 1.点击访达 -> 前往文件夹 -> 输入/usr
截屏2020-03-29下午12.00.42.png
  • 2.查看文件夹,发现错误中描述的文件果然都在,然后右击local文件夹 -> 显示简介,对权限进行更改。
截屏2020-03-29下午1.59.16.png
截屏2020-03-29下午12.23.43.png
  • 3.回到终端,继续执行命令brew upgrade carthage,开始执行更新。
截屏2020-03-28下午6.03.26.png
  • 4.但是它又报错了,执行时失败,但是命令并没有立即停止执行,还在继续,那就等等吧。
截屏2020-03-28下午6.05.37.png
  • 5.报警告了,从源安装失败,这也太坎坷了,但命令仍旧没有停下,而是在继续执行,
截屏2020-03-28下午6.06.20.png

译:您处于“分离头”状态。您可以四处查看,进行实验性更改并提交它们,并且可以放弃在此状态下所做的任何提交,而不影响执行另一次签出的任何分支。

译:如果要创建新分支以保留创建的提交,可以(现在或以后)通过再次使用-b和checkout命令来创建。示例:git checkout-b<new-branch-name>

  • 6.命令终于结束了,哎?这咋还把啤酒端上来了?难道成功了?
截屏2020-03-28下午7.01.49.png
  • 7.赶快检查了一下,执行Carthage version查看版本,果然更新了。
截屏2020-03-29下午2.41.34.png

Dependency "xxx" has no shared framework schemes 错误

那么问题来了,究竟是什么导致报错的,查看了一下执行Carthage update --platform iOS命令的输出,原来早已报错了,只是当时没有留意,急着运行项目了,但framework已经编译失败了。报错如图:

截屏2020-03-29下午2.40.49.png

后来通过版本对比,发现我编译的项目的在打开.xcodeproj包内容时,是这样的:

截屏2020-03-30下午1.56.23.png

而编译没有问题的项目,在打开.xcodeproj包内容时,是这样的:

截屏2020-03-30下午1.57.27.png

处理办法,使用Xcode打开该项目,点击Product -> Scheme -> Manage Schemes...,打开如图所示:

截屏2020-03-30下午2.12.36.png

上面操作完成后,会弹出下面的界面,直接关闭即可,然后查看文件是否已经生成,然后推送代码到远端,重新执行Carthage update --platform iOS命令。

截屏2020-03-30下午2.17.49.png

xcuserdata文件夹的简要介绍

此文件夹是项目创建时跟随创建的,里面路径类似位:

/Users/shawn/Desktop/iOS-Common/Common.xcodeproj/xcuserdata/shawn.xcuserdatad/xcschemes/xcschememanagement.plist

执行上面的操作后,则会把该目录下的" shawn.xcuserdatad -> xcschemes -> ***.xcscheme "文件移动到" xcshareddata->xcschemes "文件夹下;

删除此文件夹的话," xcschememanagement.plist "会在启动该项目时重建的,但是" ***.xcscheme "文件是不会重建的,就会丢失" xcscheme "文件。

此目录下会有多个文件夹,这根据不同的用户来命名的,当使用版本管理器时,而且没有忽略该文件夹,就会发现此目录下就可能会有多个人的目录。

一般来说,此目录不太建议放到svn里面,因为这个目录放的是一些个人设置,还有断点设置一类的,即使你放到svn里面,别人也不会加载,因为Xcode只会加载对应用户名的文件夹。

需要和别人共享的xcschemes,应该放到下面的 " xcshareddata "文件夹,然后使用svn来同步 " xcshareddata "文件夹

xcshareddata 文件夹的简要介绍

项目一开始时,是没有" xcshareddata "文件夹的。当如上面的操作中 " shared "复选框被选中,则会把 "xcuserdata "里相应的xcscheme文件移动到本目录的xcschemes文件夹下,这时才会创建此文件夹。

多人开发时,为了支持共享xcscheme,一般会勾选" shared ",这样,相应的" ***.xcscheme "就会被移动到该目录下。所以在多人开发时,应该把此目录放到svn里去同步,同时注意,被共享的" ***.xcscheme "也会影响到队友,要慎重修改。

注:删除此目录后,重新打开项目也不会重建的,删之要慎重。如果删除此目录,而" xcuserdata "文件夹下也没有xcscheme文件,那么你打开项目,j就可能会无法编译了。如果出现了这种情况,那么你把" xcuserdata "文件夹给删除掉,重启项目,Xcode会重新创建xcuserdata文件夹和默认的xcscheme文件。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容

  • 项目组件化、平台化是技术公司的共同目标,越来越多的技术公司推崇使用pod管理第三方库以及私有组件,一方面使项目架构...
    swu_luo阅读 21,613评论 0 39
  • CocoaPods 是什么? CocoaPods 是一个负责管理 iOS 项目中第三方开源库的工具。CocoaPo...
    朝洋阅读 25,662评论 3 51
  • 一. CocoaPods的介绍 什么是CocoaPods?CocoaPods是一个负责管理iOS项目中第三方开源库...
    辉712阅读 3,916评论 0 7
  • 2018.12.17今日体验: 的境界在于理解,支持,感谢曾经帮助我的人,这是对你的一种信任,在这其中,包含了多少...
    京心达_周莎阅读 105评论 0 0
  • 1、原文 子曰:“温故而知新,可以为师矣。” 2、傅佩荣原文 孔子说:“熟读自己所学的知识,并由其中领悟新的道理,...
    小刀123阅读 172评论 0 0