yum 程序包管理简介
rpm可以实现程序的快速,简单安装(跟编译安装比),但是rpm自己不能解决依赖,所以很多工具为了自动解决依赖应运而生,其中yum就是其中之一。
yum解决依赖的办法:
必须有个文件服务器,里面放置所以的rpm包,以及包的相关元数据(-qi,-qR得到的数据)。元数据可以使用
createrepo
来创建。并放置在repodata目录下。这个文件服务器可以使用ftp,http,nfs协议来传输数据,也可以使用file:///(本地服务)。
客户端使用yum程序,安装程序包。安装时,查询文件服务器,自己从文件服务器找依赖,并安装。
yum是一个程序,查看本机是否安装了yum:
# rpm -q yum
yum-3.4.3-161.el7.centos.noarch
查看yum程序所使用的配置文件:
/etc/yum.conf是主配置文件,它里面引用了目录/etc/yum.repos.d/,所以/etc/yum.repos.d/目录下的*.repo也是yum的配置文件.它提供了所以仓库的公共配置。
实现了把配置文件分割成了许多独立的小的配置文件。
/etc/yum.repos.d/目录下的*.repo:为仓库的指向提供配置信息。
# rpm -qc yum
/etc/logrotate.d/yum#log用
/etc/yum.conf
/etc/yum/version-groups.conf#版本控制
/etc/yum.conf内容:
[main]
cachedir=/var/cache/yum/$basearch/$releasever
keepcache=0
debuglevel=2
logfile=/var/log/yum.log
exactarch=1
obsoletes=1
gpgcheck=1
plugins=1
installonly_limit=5
bugtracker_url=http://bugs.centos.org/set_project.php?project_id=23&ref=http://bugs.centos.org/bug_report_page.php?category=yum
distroverpkg=centos-release
# This is the default, if you make this bigger yum won't see if the metadata
# is newer on the remote and so you'll "gain" the bandwidth of not having to
# download the new metadata and "pay" for it by yum not having correct
# information.
# It is esp. important, to have correct metadata, for distributions like
# Fedora which don't keep old packages around. If you don't like this checking
# interupting your command line usage, it's much better to have something
# manually check the metadata once an hour (yum-updatesd will do this).
# metadata_expire=90m
# PUT YOUR REPOS HERE OR IN separate files named file.repo
# in /etc/yum.repos.d
[main]:主配置,相当于程序的指向入口
cachedir:缓存路径
keepcache:是否保持缓存
debuglevel:调试级别
logfile:日志文件
exactarch:是否做精确匹配。如果OS是centos7,当找到的rpm包,既有centos6的也有centos7的,如果此处的值是1,则选择centos7的。
gpgcheck:安装时,是否检查完整性和来源合法性。1则检查
plugins:yum是否支持插件。1则支持
使用whatis查看是否有man帮助。
# whatis yum.conf
yum.conf (5) - Configuration file for yum(8).
使用:man 5 yum.conf
可以得到详细的yum.conf配置文件的详细帮助。
仓库指向的定义
[repositoryid]:仓库的id
name=仓库的名字
baseurl=url://path/to/repository/:仓库在哪里,地址可以有多个,那么选哪个呢?根据failovermethod选。
baseurl=url://server1/path/to/repository/
url://server2/path/to/repository/
url://server3/path/to/repository/
- failovermethod={roundrobin|priority}。默认为roundrobin,意味随机选一个url
- gpgcheck={1|0}:1则检查。默认是1.
- enabled={1|0}:是否使用此repo
- gpgkey=URL:公钥
- enablegroups={1|0}:1则使用组功能。默认是1.
- const=默认是1000.有多个符合就选cost小的。
centos7下/etc/yum.repos.d/下的repo配置文件有几个,只有CentOS-Base.repo文件里repo的enabled是1,也就是可以使用状态,其余的配置文件里的repo的enabled都是0.
# ls /etc/yum.repos.d/
CentOS-Base.repo CentOS-CR.repo CentOS-fasttrack.repo CentOS-Sources.repo
CentOS-Base.repo_20191129 CentOS-Debuginfo.repo CentOS-Media.repo CentOS-Vault.repo
查看配置文件:/etc/yum.repos.d/CentOS-Base.repo的内容。
[base]
name=CentOS-$releasever - Base
baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos/$releasever/os/$basearch/
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
#released updates
[updates]
name=CentOS-$releasever - Updates
baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos/$releasever/updates/$basearch/
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras
baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos/$releasever/extras/$basearch/
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-$releasever - Plus
baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos/$releasever/centosplus/$basearch/
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
指定baseurl的技巧:指到repodata所在的网页的URL。
上面的updates的baseurl的值就是下图的网页地址栏的URL。理由是repodata在这里。
查看repo list:
# yum repolist
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
repo id repo name status
!base/7/x86_64 CentOS-7 - Base 10,097
!extras/7/x86_64 CentOS-7 - Extras 323
!updates/7/x86_64 CentOS-7 - Updates 1,446
repolist: 11,866
repo id:
repo name:是配置文件/etc/yum.repos.d/CentOS-Base.repo里的name的值
status:这个repo里的rmp包的数量。
yum命令介绍
yum [options][command] [package ...]
显示repo(仓库)列表(list):repolist [all|enabled|disabled]
- all:显示全部
- enabled:显示可用的。默认值。就是本地repo配置文件里enabled=1的repo会显示出来。
- disabled:显示不可用的。就是本地repo配置文件里enabled=0的repo会显示出来。
# yum repolist all
# yum repolist enabled
# yum repolist disabled
显示指定repo里有哪些rpm包:
yum list [all | glob_exp1] [glob_exp2] [...]
显示所有的包:
# yum list
可以使用glob_exp。
显示内容的第三列:repo配置文件中的repoid
# yum list php*
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
Available Packages
php.x86_64 5.4.16-46.1.el7_7 updates
php-bcmath.x86_64 5.4.16-46.1.el7_7 updates
php-pear.noarch 1:1.9.4-21.el7 base
php-pecl-memcache.x86_64 3.0.8-4.el7 base
显示repo中还未安装的包:
yum list available [glob_exp1][...]
# yum list available
显示repo中的可以升级的包:
yum list updates [glob_exp1][...]
# yum list updates
显示已经安装的包:
yum list installed [glob_exp1][...]
- @anaconda:安装系统时,安装的包。
- installed:后来自己安装的。
# yum list installed
zlib.x86_64 1.2.7-18.el7 @anaconda
zsh.x86_64 5.0.2-33.el7 installed
显示已经安装了的extra repo中的包:
yum list extras [glob_exp1][...]
# yum list extras
显示已经安装的包,哪些已经废弃了:
yum list distro-extras [glob_exp1][...]
# yum list distro-extras
安装包:
yum install package1 [package2
如果repo里有多个版本,可以指定版本,例如:
yum install gcc-4.8.5
也可以不指定版本,则安装最新版:
yum install gcc
升级包:
yum update [package1][package2] [...]
# yum update gcc
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
No packages marked for update
降级:
downgrade package1 [package2][...]
类似:
rpm -Uvh --oldpackage
重新覆盖安装:
reinstall package1 [package2][...]
类似:
rpm -ivh --replacepkgs
检查有哪些包可以升级:
yum check-update
卸载包:
yum remove | erase package1 [package2][...]
当卸载的包,被别的包依赖时,别的包也一并被卸载
卸载cpp:由于gcc依赖于cpp,所有如果卸载cpp,则gcc也会被卸载。
查看包的信息:
yum info [glob_exp1][...]
类似rpm -qi
# yum info gcc
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
Installed Packages
Name : gcc
Arch : x86_64
Version : 4.8.5
Release : 39.el7
Size : 37 M
Repo : installed
From repo : base
Summary : Various compilers (C, C++, Objective-C, Java, ...)
URL : http://gcc.gnu.org
License : GPLv3+ and GPLv3+ with exceptions and GPLv2+ with exceptions and LGPLv2+ and BSD
Description : The gcc package contains the GNU Compiler Collection version 4.8.
: You'll need this package in order to compile C code
查看程序或文件是有哪个包提供的:
yum provides | whatprovides feature1 [feature2
类似rpm -qf file
# yum provides /usr/bin/gcc
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
gcc-4.8.5-39.el7.x86_64 : Various compilers (C, C++, Objective-C, Java, ...)
Repo : base
Matched from:
Filename : /usr/bin/gcc gcc-4.8.5-39.el7.x86_64 : Various compilers (C, C++, Objective-C, Java, ...)
Repo : @base
Matched from:
Filename : /usr/bin/gcc
清除元数据文件在本地的缓存:
clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]
yum按文件时,会把程序包和元数据文件缓存在本地,当安装结束,yum会删除程序包文件,但是不会删除 元数据文件。
构建缓存:
yum makecache [fast]
用关键字搜索信息:
yum search string1 [string2][...]
从包名和包的summary里搜索指定的关键字。
# yum search bash
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
====================================================== N/S matched: bash =======================================================
bash-completion.noarch : Programmable completion for Bash
bash-doc.x86_64 : Documentation files for bash
libguestfs-bash-completion.noarch : Bash tab-completion scripts for libguestfs tools
libvirt-bash-completion.x86_64 : Bash completion script
pcp-pmda-bash.x86_64 : Performance Co-Pilot (PCP) metrics for the Bash shell
bash.x86_64 : The GNU Bourne Again shell Name and summary matches only, use "search all" for everything.
显示某个包所依赖的包:
deplist package1 [package2][...]
# yum deplist gcc
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
package: gcc.x86_64 4.8.5-39.el7
dependency: /bin/sh
provider: bash.x86_64 4.2.46-33.el7
dependency: /sbin/install-info
provider: info.x86_64 5.1-5.el7
...
查看yum的安装,更新,卸载的历史:
yum history
不带参数则是history listhistory [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]
# yum history
Loaded plugins: fastestmirror, langpacks
ID | Login user | Date and time | Action(s) | Altered
-------------------------------------------------------------------------------
5 | root <root> | 2020-02-15 23:00 | Install | 2
4 | root <root> | 2020-02-15 22:59 | Erase | 8
3 | root <root> | 2020-02-15 22:48 | Update | 11 <
2 | ys <ys> | 2019-11-29 17:38 | Install | 8 >
1 | System <unset> | 2019-11-29 16:44 | Install | 1458
history list
上面是汇总的信息,如果想看id为5的详细信息,也就是id为5的安装了哪些包,则使用:
# yum history info 5
Loaded plugins: fastestmirror, langpacks
Transaction ID : 5
Begin time : Sat Feb 15 23:00:14 2020
Begin rpmdb : 1459:fe9d7def2a5edd098cfe39ebe0732b67038170b5
End time : 23:00:19 2020 (5 seconds)
End rpmdb : 1461:ed3657ce694e0e90ea8bf62a092f06422c81ac28
User : root <root>
Return-Code : Success
Command Line : install gcc
Transaction performed with:
Installed rpm-4.11.3-35.el7.x86_64 @anaconda
Installed yum-3.4.3-161.el7.centos.noarch @anaconda
Installed yum-plugin-fastestmirror-1.1.31-50.el7.noarch @anaconda
Packages Altered:
Dep-Install cpp-4.8.5-39.el7.x86_64 @base
Install gcc-4.8.5-39.el7.x86_64 @base
history info
查看yumdb大小:
# yum history stats
Loaded plugins: fastestmirror, langpacks
File : //var/lib/yum/history/history-2020-02-16.sqlite
Size : 23,552
Transactions: 0
history stats
本地安装/升级:想安装的包在yum repo中没有,可以下载一个rpm包安装。但为什么不用rpm呢,因为rpm不能解决依赖,而yum可以,所以即使是本地的rpm包,也可以使用yum安装,但是参数是rpm文件名。
localinstall/localupdate是为了兼容以前的版本,应该使用intall/update 参数是rpm文件名。
localinstall rpmfile1 [rpmfile2][...]
(maintained for legacy reasons only - use install)
localupdate rpmfile1 [rpmfile2][...]
(maintained for legacy reasons only - use update)
组安装/更新/卸载/查看
查看有哪些组可供安装:
# yum groups list
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
Available Environment Groups:
Minimal Install
Compute Node
Infrastructure Server
File and Print Server
Basic Web Server
Virtualization Host
Server with GUI
GNOME Desktop
KDE Plasma Workspaces
Development and Creative Workstation
Installed Groups:
Development Tools
Available Groups:
Compatibility Libraries
Console Internet Tools
Graphical Administration Tools
Legacy UNIX Compatibility
Scientific Support
Security Tools
Smart Card Support
System Administration Tools
System Management
Done
查看某个组里有哪些包:
# yum groups info Development\ Tools
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile Group: Development Tools
Group-Id: development
Description: A basic development environment.
Mandatory Packages:
gcc
=gcc-c++
gettext
=libtool
make
Default Packages:
byacc
=gcc-gfortran
swig
=systemtap
Optional Packages:
ElectricFence
ant
babel
bzr
Mandatory Packages:必须安装的包
Default Packages:默认安装的包
Optional Packages:可选安装的包
安装:
# yum groups install "Development Tools"
更新:
# yum groups update "Development Tools"
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
Maybe run: yum groups mark install (see man yum)
No packages in any requested group available to install or updates
删除:
# yum groups remove Development\ Tools
拿光盘作为repo
1,先挂载centos系统安装盘到/media目录。
2,创建文件local.repo
[base]
name=local repo centos
baseurl=file:///media/
enabled=1
gpgcheck=0
3,然后就可以正常使用yum命令了。
yum 常用的命令行选项
- 禁止进行gpg check:--nogpgcheck
- 自动回答yes:-y
- 不输出安装信息:-q
- 禁用指定的repo(可以使用glob匹配):--disablerepo=repoid(glob)
- 启用指定的repo(可以使用glob匹配):--enablerepo=repoid(glob)
- 禁用所有插件:--noplugins
yum的repo配置文件中可用的变量
$releasever:当前OS的发行版的主版本号。centos7的话,此变量的值就是7
$arch:架构。比如i386,i486等
$basearch:基础架构。如果是ix86架构的话,则此变量的值为i386
$YUM0-$YUM9:自定义变量
使用变量的例子:
name=CentOS-$releasever - Updates
baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos/$releasever/updates/$basearch/
自己创建yum repo:createrepo [options] <directory>
使用createrepo很简单,只需要指定rpm包所在的目录。
就会做成目录:repodata
# pwd
/tmp/repos
# createrepo ./
Spawning worker 0 with 19 pkgs
Workers Finished
Saving Primary metadata
Saving file lists metadata
Saving other metadata
Generating sqlite DBs
Sqlite DBs complete
# ls -d repodata/
repodata/
repodata目录的文件构成:
# ll repodata/
total 52
-rw-r--r--. 1 root root 12690 Feb 16 11:24 7150dafd709770a783ea087b2ff869aaecfb007b0fcce6f544924c4c1e1e4405-primary.sqlite.bz2
-rw-r--r--. 1 root root 4184 Feb 16 11:24 7f43292a24f471448badbf18db488dbe52efc22237170ad2f6fc7aa36ac45a0e-primary.xml.gz
-rw-r--r--. 1 root root 2686 Feb 16 11:24 8351058925b5438dbe9abd2c246c64f3eafcc741f644ef268ac8747a82bc48ab-filelists.xml.gz
-rw-r--r--. 1 root root 2655 Feb 16 11:24 a5b6ce405bfa9814e77ab3159b77aa4a2c55ac445a5244ff449b1125badc2a9b-other.xml.gz
-rw-r--r--. 1 root root 5918 Feb 16 11:24 c58fa90f9a3825f07092ff63f524a86183a0e9f99e19d3a84b785cef2edf93f8-other.sqlite.bz2
-rw-r--r--. 1 root root 5423 Feb 16 11:24 fa9fbb57fe96cf749733a6232b4860f70c7abd60b7b0c72f9486771f63f9a4ec-filelists.sqlite.bz2
-rw-r--r--. 1 root root 2976 Feb 16 11:24 repomd.xml
创建repo配置文件:
[local2]
name=your repo centos
baseurl=file:///tmp/repos
enabled=1
gpgcheck=0
验证:repoid:local2已经可以使用了
# yum repolist local2
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
repo id repo name status
local2 your repo centos 19
repolist: 19
cento下的开发包组:
- Development Tools:要想自己编译源码,必须安装此包组。
- Server Platform Development
- Desktop Platform Development(图形界面的)
编译源码安装:
1,configure脚本使用和作用
作用:指定安装到哪,启用哪些特性
使用:每个源代码的configure的用法可能都不一样,所有使用前,用:configure --help
查看都支持哪些选项。
选项分类:
安装路径设定:
--prefix=/path/to/somewhere:指定安装路径(方便以后卸载,直接把目录删除)。不指定可能安装到了/usr/local
--sysconfdir=/path/to/somewhere:指定配置文件放到哪里
交叉编译设定:
--build=BUILD configure for building on BUILD [guessed]
--host=HOST:编译后运行的目标架构。cross-compile to build programs to run on HOST [BUILD]
--target=TARGET configure for building compilers for TARGET [HOST]
安装特性设定:
--disable-FEATURE
--enable-FEATURE[=ARG]
设定安装时依赖哪些包,不依赖哪些包
--with-PACKAGE[=ARG]:ARG为路径信息等。
--without-PACKAGE
源码安装结束后的配置
1,把可执行程序目录添加到PATH环境变量
新建文件:/etc/profile.d/NAME.sh
添加 export PATH=/PATH/TO/BIN:$PATH
2,添加库文件路径
新建文件:/etc/ld.so.conf.d/name.conf
添加:/PATH/TO/lib
3,让系统找到头文件
创建头文件的符号链接:`ln -s /PATH/TO/include /usr/include/
4,导出帮助手册
编辑/etc/man_db.conf,添加:
#MANDATORY_MANPATH /usr/src/pvm3/man
#
MANDATORY_MANPATH /usr/man
MANDATORY_MANPATH /usr/share/man
MANDATORY_MANPATH /usr/local/share/man
MANDATORY_MANPATH /PATH/TO/man
# c/c++ 学习互助QQ群:877684253
![](https://img2018.cnblogs.com/blog/1414315/201811/1414315-20181106214320230-961379709.jpg)
# 本人微信:xiaoshitou5854
yum 程序包管理简介的更多相关文章
- Linux程序包管理之yum及源代码安装
第十六章.Linux程序包管理之yum及源代码安装 目录 yum介绍 yum配置文件 yum的repo配置文件中可用的变量 yum命令的使用 使用光盘作为本地yum仓库 如何创建yum仓库 编译安装的 ...
- Linux 程序包管理-YUM
前端工具YUM管理程序包: rpm管理软件虽然方便,但是需要手工解决软件包的依赖关系:很多时候安装一个软件需要首先安装一个或多个(有时多达上百个)其它软件,手工解决很复杂:使用yum可以解决这个问题 ...
- 程序包管理rpm、yum与简单编译安装程序
Linux程序包管理 Linux中软件的安装主要有两种形式:一种是直接下载源代码包自行编译后安装,另一种直接获取rpm软件包进行安装. 程序的组成部分: 二进制程序:程序的主体文件,比如我们运行一个l ...
- Linux程序包管理rpm与yum
Linux程序包管理 Linux中软件的安装主要有两种形式:一种是直接下载源代码包自行编译后安装,另一种直接获取rpm软件包进行安装. 程序的组成部分: 二进制程序:程序的主体文件,比如我们运行一个l ...
- linux基础之程序包管理(rpm,yum)
一.rpm 安装:rpm { -i | --install } [ install-options ] PACKAGE_FILE... -v: 显示安装时的详细信息 -vv: 显示许多难以阅读的调试信 ...
- 程序包管理rpm和yum
Linux程序包管理: API:Application Programming Interface源码包 POSIX:Portable OS 程序源代码 --> 预处理 --> 编译 -- ...
- Linux 程序包管理-RPM
程序简介: POSIX(Portable Openratin System)跨平台系统:不同操作系统平台的标准C库(glibc)都是遵循POSIX规范的,这样基于标准库开发程序的源代码可以夸平台编译 ...
- Linux:Day10 程序包管理
YUM:yellow dog,Yellowdog Update Modifier yum repository:yum repo 存储了众多rpm包,以及包的相关的无数据文件(放置于特定目录下:rep ...
- Linux:Day9(下) 程序包管理
API:Application Programming Interface POSIX:Portable OS 程序源代码 --> 预处理 --> 编译 --> 汇编 --> ...
随机推荐
- 微服务的多数据源配置: step 1
spring boot + mybatis: 实现的功能点: 多数据源 jdbc: spring.datasource.test1.url = jdbc:mysql://localhost:3306/ ...
- mybatis generator cmd 终端命令 生成dao model mapper
mybatis generator cmd 终端命令 生成dao model mapper 文件包下载 mybatis-generator-core-1.3.2.jar 下载地址:https://gi ...
- 文件系统(01):基于SpringBoot框架,管理Excel和PDF文件类型
本文源码:GitHub·点这里 || GitEE·点这里 一.文档类型简介 1.Excel文档 Excel一款电子表格软件.直观的界面.出色的计算功能和图表工具,在系统开发中,经常用来把数据转存到Ex ...
- e.detail.value 获取input的值
inputId(e) { this.setData({ inputId: e.detail.value }) },
- [apue] 书中关于伪终端的一个纰漏
在看 apue 第 19 章伪终端第 6 节使用 pty 程序时,发现“检查长时间运行程序的输出”这一部分内容的实际运行结果,与书上所说有出入. 于是展开一番研究,最终发现是书上讲的有问题,现在摘出来 ...
- 【WPF学习】第四十章 画刷
画刷填充区域,不管是元素的背景色.前景色以及边框,还是形状的内部填充和笔画(Stroke).最简单的画刷类型是SolidColorBrush,这种画刷填充一种固定.连续的颜色.在XAML中设置形状的S ...
- Codeforces_820
A.直接模拟. #include<bits/stdc++.h> using namespace std; int c,v0,v1,a,l; int main() { ios::sync_w ...
- POJ_1182_并查集
http://poj.org/problem?id=1182 pre构建有关系的号码的树,rel保存当前号码与根的关系,0表示相同,1表示根吃当前,2表示当前吃根. 代码中的更新公式可以先把各种情况枚 ...
- POJ_2342_树状dp
http://poj.org/problem?id=2342 第一道树状dp,入门题,用vector构建有向图. #include<iostream> #include<cstrin ...
- (四)mybatis逆向工程
构建 逆向工程就是说通过数据库当中的表生成class,mapper,接口,不需要自己编写那些,很方便.跟symfony里面的自动生成是一样的:视频里的人说用的不多,但我觉得很方便呀 具体步骤,首先导入 ...