博客引流

用过Mac的肯定 或多或少的 用过 brew这个命令

在我之前的印象里 这个命令就好像
Ubuntu里的apt-get
Centos里的yum

都是属于那种Linux下包管理器

那他们之间有什么区别呢?

先下结论:
源码包安装: brew
二进制包安装: yun | apt-get

源码安装

首先回顾一下什么是源码安装

从命令上来看源码安装一般形式如下:

wget https://xxx.com/latest.tar.gz
tar -zxvf latest.tar.gz -C /usr/src
cd /usr/src/xxxx
./configure
make && make install

wget tar应该是显而易见的,分别代表下载和解压命令

./configure

那么configure是一个怎样的命令

#!/bin/sh
SUFFIX=""
DRYRUN="false"
VERBOSE="false"
EXE=""
THERE=`dirname $0`# pick up any command line args to config
for i
do
case "$i" in
-d*) options=$options" --debug";;
-t*) DRYRUN="true" VERBOSE="true";;
-v*) VERBOSE="true";;
-h*) DRYRUN="true"; cat <<EOF
Usage: config [options]-d     Build with debugging when possible.-t     Test mode, do not run the Configure perl script.-v     Verbose mode, show the exact Configure call that is being made.-h     This help.Any other text will be passed to the Configure perl script.
See INSTALL for instructions.EOF
;;
*)  i=`echo "$i" | sed -e "s|'|'\\\\\\''|g"`options="$options '$i'" ;;
esac
...

可以看出实际上configure是一个shell脚本,一般这个脚本都很长,目前看到最小的也有1k行

其主要作用就是检查编译环境,是否满足编译条件,是否有需要的预装软件

如果条件一切正常 则会生成MakeFile文件 供下一步make使用

当然有些包的configure文件可能只是一个重定向文件,真正的sh藏在bootstrap文件中

#!/bin/sh
cmake_source_dir=`cd "\`dirname \"$0\"\`";pwd`
exec "${cmake_source_dir}/bootstrap" "$@"
$ ./configure
checking whether to enable maintainer-specific portions of Makefiles... no
checking whether make supports nested variables... yes
checking whether to enable debug build options... no
checking whether to enable compiler optimizer... (assumed) yes
checking for path separator... :
checking for sed... /bin/sed
checking for gcc... gcc

configure运行结束之后会

  • 由MakeFile.in 生成 MakeFile文件
  • 由config.h.in 生成 config.h文件
  • config.log 日志文件
  • config.cache 提高下一次configure的速度 需要-C才生成
  • config.status 实际调用编译工具构建软件的shell脚本

make - 即利用gcc对.h文件进行编译 输出可执行文件

然后利用make install 则是进行软链接之类的操作,把安装得到的可执行文件,放到合适的位置

autoconf

实际上这一套体系叫做GNU build system

是为了跨平台安装 而提出的 以提高代码的可移植性

作为一个底层码农肯定体会过配置环境的艰辛

对于软件开发者 为了适配所有环境写出的编译sh那肯定更加困难

Unix系统的分支复杂度很高,不同的商用版或开源版或多或少都有差异。这些差异主要体现在:系统组件、系统调用。我们主要将Unix分为如下几个大类:IBM-AIX HP-UX Apple-DARWIN Solaris Linux FreeBSD

为了规避写繁琐的shell脚本,有人开发了autoconf和automake这样的工具

autoconf通过编写configure.ac来configure脚本

这个时候configure.ac就好写很多

AC_PREREQ([2.63])
AC_INIT([st], [1.0], [zhoupingtkbjb@163.com])
AC_CONFIG_SRCDIR([src/main.c])
AC_CONFIG_HEADERS([src/config.h])AM_INIT_AUTOMAKE([foreign])# Checks for programs.
AC_PROG_CC
AC_PROG_LIBTOOL# Checks for libraries.# Checks for header files.# Checks for typedefs, structures, and compiler characteristics.# Checks for library functions.AC_CONFIG_FILES([Makefilesrc/Makefilesrc/a/Makefilesrc/b/Makefile])
AC_OUTPUT

AC_开头的类似函数调用一样的代码,实际是一些被称为“宏”的调用

这里的宏与C中的宏概念类似,会被替换展开

m4是一个经典的宏工具,autoconf正是构建在m4之上,可以理解为autoconf预先实现了大量的,用于检测系统可移植性的宏,这些宏在展开后就是大量的shell脚本

所以编写configure.ac只要对这些宏熟练掌握就可以了,成本较手写shell省事很多

GNU还有很多生硬的内容,本文就点到为止,有需要的可以继续查阅相关资料

brew

brew 是开发者为了在没有GNU build system下的情况下为了更好的跨平台安装 开发的一个包管理工具

和其他使用二进制包的依赖包管理工具不同的是

brew是基于源码包管理

也是先遍历一遍依赖列表

先安装依赖包

最后安装所需包

安装时执行./configure && make && make install

brew cask

brew cask 则是brew的一个扩展包

brew主要面向命令行程序

brew cask主要面向图形化程序

把这些程序用brew cask管理

使之也能用命令行进行方便的安装和卸载

二进制包安装

二进制包指的是已经经过编译好的,一般只需建立软链接,或者rebuild的代码包

一般二进制包的包名会较源码包长 会包含运行环境等相关信息

根据不同规范可以分为.rpm包和.deb包

RPM

RPM = RedHat Package Manager

一开始是由Red Hat开发,之后被广泛采用的一种包管理策略

其主要思想就是把编译之后的文件及所需要的软件名称打包,安装时只需要去检查是否满足安装条件,无需编译,即可安装

其包名满足

%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}.rpmNAME: rpm包名字
VERSION: rpm包版本号(主版本号.次版本号.测试号)
RELEASE: rpm包编译发布次数(第几次编译发布)
ARCH: cpu架构(比如i386和x86_64,i386兼容x86_64,noarch的代表一些列脚本)比如nginx-1.4.0-24.x86.rpm,nginx-1.4.0-24.x86_64.rpm

YUM

YUM是基于rpm的包管理容器, 是一种CS架构的软件, 解决了包之间依赖的问题

Server端先对程序包进行分类后存储到不同repository容器中

再通过收集到大量的rpm的数据库文件中程序包之间的依赖关系数据, 把对应的依赖关系和所需文件存在说明文件(.xml格式)里, 放在本地的repodata目录下供Client端取用

而Cilent端通过yum命令安装软件时发现缺少某些依赖性程序包, Client会根据本地的配置文件(etc/yum.repos.d/*.repo)找到指定的Server端,

从Server端repo目录下获取说明文件xxx.xml后存储在本地/var/cache/yum中方便以后读取

通过xxx.xml文件查找到需要安装的依赖性程序包在Server端的存放位置

再进入Server端yum库中的指定repository容器中获取所需程序包, 下载完成后在本地实现安装

apt-get

在介绍agt-get 之前 先介绍下dpkg

dpkg = Debian package manager

其余rpm原理几乎相同,使用文本文件作为数据库来维护系统中软件信息,包括文件清单, 依赖关系, 软件状态等,通常在/var/lib/dpkg目录下

在status文件中存储软件状态和控制信息

在info目录下备份控制文件, 并在info/.list文件中记录安装文件清单, 在info/.mdasums中保存文件的MD5码

那么apt-get 就相当于中的rpm的yum

做的是自动化获取安装包依赖的工作

apt-get update 过程

1. 执行apt-get update
2. 程序分析/etc/apt/sources.list
3. 自动连网寻找list中对应的Packages/Sources/Release列表文件,如果有更新则下载,存入/var/lib/apt/lists/目录
4. 然后 apt-get install 相应的包 ,下载并安装

apt-get install 过程

1. 扫描本地存放的软件包更新列表,找到最新版本包
2. 进行包依赖检查,找到所有需要的依赖包
3. 从源中下载相应的包并解压,建立软链接

参考

  1. brew和brew cask有什么区别?
  2. apt-get原理解析
  3. 深入理解yum工作原理
  4. rpm包制作
  5. Linux软件安装管理之——RPM与YUM详解
  6. 概念:GNU构建系统和Autotool

brew | brew cask | yum | apt-get相关推荐

  1. linux 软件源 镜像源 yum apt pip

    linux 软件源 镜像源 yum apt pip 1.linux源 2.pypi 源 1.linux源 中国科技大学 http://mirrors.ustc.edu.cn/ 科大源帮助 http ...

  2. brew卸载jenv_使用brew,cask和jenv在MacOSX上设置多个Java JRE / JDK

    brew卸载jenv 昨天在Java9的Jigsaw HackTheTower事件中,我意识到我需要加强我的游戏并改善我现有的机制,以在我的机器上维护几个不同的JDK. 我曾经手动下载jdk,或使用b ...

  3. 使用brew,cask和jenv在MacOSX上设置多个Java JRE / JDK

    昨天在Java9的Jigsaw HackTheTower事件中,我意识到我需要加强我的游戏并改善我现有的机制,以在我的机器上维护几个不同的JDK. 我曾经手动下载jdk,或使用brew cask安装它 ...

  4. Calling brew cask install is disabled! Use brew install [--cask] instead

    最近换了mac brew cask 安装软件 报错 这个问题是2.7 的 brew 把这个 brew cask install xxx 放弃使用了 改为了 brew install xxx --cas ...

  5. Mac 安装 brew brew cask 遇到的问题及解决办法

    文章目录 安装 brew Error 解决办法 安装 brew cask Error 解决办法 安装 brew 在 Terminal 执行 官网提供的命令即可 /usr/bin/ruby -e &qu ...

  6. brew Error: Cask ‘adoptopenjdk8‘ is unreadable

    错误如图 解决方法 brew update-reset 参考 https://github.com/Homebrew/homebrew-cask/issues/59840

  7. cmd find 命令 多个 或者 关系 +windows_Chocolatey -Windows系统的yum||apt 软件安装工具...

    1. Chocolatey是Windows系统下的包管理工具, 与Linux系统的yum或apt一样,支持通过命令行工具安装软件,是软件包数量最多的包管理器,几乎覆盖Windows常用软件,总软件数量 ...

  8. ios-deploy out of date (1.9.4 is required). To upgrade with Brew: brew upgrade ios-deploy

  9. Mac 下的软件安装 —— 从 pkg,dmg 到 brew,cask

    本文转载自坚持编程_lyz 文章原链接https://www.jianshu.com/p/61f209cd0e91 且该作者转载自原作者Elsewhere**(但此链接已无法访问) http://co ...

最新文章

  1. lattice LFE3-17EA 调试记录
  2. python算法实现源码_python 实现A_算法的示例代码
  3. Oracle把逗号分割的字符串转换为可放入in的条件语句的字符数列
  4. Spring模块化设计:Spring功能特性如何在不同模块中组织?
  5. 【Vulnhub靶机系列】DC1
  6. 关于 Orbeon form PE 版本 Unauthorized 错误消息
  7. 电子设计竞赛(4)-常用的两种PID算法
  8. react滑动切换tab动画效果_使用React实现的水平标签(Tab)栏
  9. Kaggle泰坦尼克数据科学解决方案
  10. 系统如何实现权限控制
  11. 【推荐】数据科学中的非数学特征提取方法
  12. 在Outlook 2013中发送给多个收件人时如何隐藏电子邮件地址
  13. 从PCC到MIC(2)
  14. 怎样快速将pdf在线转换成word免费版
  15. stm32F103+EncEthernet+ENC28J60驱动+ping
  16. Bootstrap4 div居中
  17. Java字符拼成图片
  18. 九月四号《算法笔记》学习
  19. 解决win10安装VC++ 出现的启动错误
  20. led接口实验微型计算机,微型计算机原来与接口技术实验报告(全)

热门文章

  1. 【操作系统】第2章 进程与线程
  2. Mysql 中source命令详解
  3. 面试必备之深入理解自旋锁
  4. 求出其中最大的元素值,以及其所在的行号和列号。
  5. Java八股文--藤原豆腐店自用
  6. 苹果手机升级13无法开机_苹果手机无法开机的解决方法
  7. java叠加两张png带透明图片
  8. iOS黑(灰)白化实现方案---记录
  9. 【java】输入一个整数判断它是偶数还是奇数
  10. 安装了Visual Studio Team System Web Access 2008 Power Tool