前言
前段时间搞Powershell在windows终端上支持一些常用的Linux命令使用了Cygwin,然后最近安装Ruby又必须提供MSYS2 and MINGW development tool chain. 最后就是xxx install xx_package
这样的命令都不支持用了多少种。因此把windows上命令行相关包管理器等一起汇总总结以下。
稍微吐槽以下:标准真的是个好东西,就像一种秩序,无论是多么糟糕的秩序,都比混乱强。因为Windows没有标准的命令行管理器(像ubuntu自带的apt、CentOS的yum等),就导致同样一个东西,百花齐放,分别维护,不同的东西喜欢依赖不同的工具。但对于用户来说这一堆东西并不感兴趣,能够提供一套一样的接口就好了。同理C++标准也是一样的。浅显的体会。
越总结越发现依赖管理对于一个编程技术发展的重要性~
命令行学习
虽然动机以及操作背景是基于Windows,但最终使用的基本都是Linux标准的命令行(Shell)。因此学习的核心还是Linux的shell。
一些很好的学习资料:(埋坑++)
- Effective Shell: 通俗易懂的从零开始
从入门到放弃的Shell学习,从基础的文件、导航,到管道、作业,命令行技巧(这节很好),正则、脚本、Grep使用等。涉及知识挺多的,虽然最终还是躲不过有点枯燥.. - 命令行的艺术:Quora中出现,许多人总结凝练的命令行知识,包括许多常用或不常用命令,内容不长,好评,应该时时习之。
- MIT补充课程The Missing Semester of Your CS Education:包含额外的整个体系,包括Shell、Vim、命令行、Git、元编程、密码学等等。官方说法是11个大概1小时的讲座(对,有视频版)
中文帮助man
看帮助是个非常重要的事情,很多时候–help显示的提示信息非常少,Linux上的man-db会提供更多的帮助内容。奈何英语水平有限,慢慢阅读man的效率还不如google搜索别人总结的内容(二手shit)。所以还是改为使用中文man。btw,Powershell上查看帮助为:Get-Help command option
.
要中文显示先要配置系统中文环境:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
# 最终显示效果 $ locale LANG=zh_CN.UTF-8 LANGUAGE=zh_CN:zh LC_CTYPE="zh_CN.UTF-8" LC_NUMERIC="zh_CN.UTF-8" LC_TIME="zh_CN.UTF-8" LC_COLLATE="zh_CN.UTF-8" LC_MONETARY="zh_CN.UTF-8" LC_MESSAGES="zh_CN.UTF-8" LC_PAPER="zh_CN.UTF-8" LC_NAME="zh_CN.UTF-8" LC_ADDRESS="zh_CN.UTF-8" LC_TELEPHONE="zh_CN.UTF-8" LC_MEASUREMENT="zh_CN.UTF-8" LC_IDENTIFICATION="zh_CN.UTF-8" LC_ALL=zh_CN.UTF-8 # 如果当前不是这个 $ sudo apt-get install language-pack-zh-hans language-pack-zh-hans-base # 个人使用zshrc所以添加到这里 $ nano ~/.zshrc # 在里面输入 export LANG="zh_CN.UTF-8" export LANGUAGE="zh_CN:zh" export LC_NUMERIC="zh_CN" export LC_TIME="zh_CN" export LC_MONETARY="zh_CN" export LC_PAPER="zh_CN" export LC_NAME="zh_CN" export LC_ADDRESS="zh_CN" export LC_TELEPHONE="zh_CN" export LC_MEASUREMENT="zh_CN" export LC_IDENTIFICATION="zh_CN" export LC_ALL="zh_CN.UTF-8"
安装manpages-zh:
1 2 3 4
sudo apt update sudo apt install manpages-zh # 然后正常使用即可 man bash
或者查看中文在线网站:Manpages of manpages-zh in Debian unstable — Debian Manpages
模拟Linux终端
类似于打开一个Linux终端进行使用,支持常见的Linux指令如ls
等。但本质上并不是运行Linux应用,运行的应用还是windows的exe。包括有:
- Cygwin
- msys2
- git-bash(安装时好像也可以选择msys2)等
这些终端内部也有一些包管理器,用于管理安装在此终端内部使用的应用。比如Mingw,全局搜一下几十处地方都有,像cygwin、mysy2、git等等都会包含一套。(Windows不像apt一样有一个全局的依赖库,真难受呀)
对比分析:[Cygwin 与 MinGW/MSYS/MSYS2,如何选择? | ZRONG’s BLOG (zengrong.net)](https://blog.zengrong.net/post/cygwin_and_mingw/) |
特点 | Cygwin | MinGW/MSYS | MSYS2 |
---|---|---|---|
是否GNU | 否 | 是 | 是 |
更多软件支持? | 支持绝大多数的 GNU 软件 | 支持常用软件,git、Vim等软件需要独立支持(详细介绍见下方) | 支持大多数 GNU 软件 |
更类Linux? | Cygwin在Windows中就好像Wine在Linux中 | 实现了Bash等主要的Linux程序 | 原生64/32bit支持 |
GCC编译 | 内含MingGW32交叉编译功能,既支持依赖cygwin1.dll的程序编译,也支持独立的Windows程序编译;可以直接编译Linux下的应用程序 | 支持独立的Windows程序编译 | 支持独立的Windows程序编译 |
中文支持 | 直接支持中文显示和输入法 | 需要配置才能支持中文显示和输入,删除一个中文字符需要删除2次 | 支持中文显示和输入法,中文帮助系统和中文提示(部分软件) |
运行速度 | 慢 | 快 | 快 |
Cygwin
动机:获得一个轻量级的类Unix终端,可以安装一些Linux工具,同时能够在Windows终端中获取一些简易Linux功能(比如在CMD中获取ls这个指令)
Cygwin 是:
- 提供功能的大量 GNU 和开源工具 类似于Windows上的Linux发行版。
- 一个DLL(cygwin1.dll),它提供了大量的POSIX API功能。
不是:
- 一种在Windows上运行本机Linux应用程序的方法。你必须 如果您希望应用程序在 Windows 上运行,请从源代码重新生成应用程序。
- 一种神奇地使本机 Windows 应用程序了解 UNIX® 的方法 信号、PTY 等功能。同样,如果你想利用Cygwin的功能,你需要从源代码构建你的应用程序。
当然除去使用Cygwin,还有类似的msys2等工具,自行选择吧,个人这里就仅需要一些很简单的功能。更复杂的支持使用前面的WSL,这里再安装一个轻量级的就是因为WSL打开较慢,占用率较高,同时不能提供外界直接使用unix指令。
安装
安装就官网下载安装包一路安装即可。
注意:
- 安装时选择一个源,推荐选择清华源:http://mirrors.ustc.edu.cn.
- 选择安装的包时,建议至少选择一个wget包。这里不用纠结安装哪些包,后续可以随时回来变更。
- 安装完成后,记得不要删除安装包。后续管理包都需要这个安装包,比如增加、卸载包。添加包不会覆盖原安装的包。
包管理器
关于包管理:就像前面说的,要通过安装包去管理包,这确实就是官方的途径。
除了安装程序之外,Cygwin中没有包管理。安装程序仅将更新应用于当前安装,它不会覆盖您已有的软件包(除非您明确说明)。
因此,请重新运行安装程序以安装新软件包。
不过还是有一些第三方巩固,比如apt-cyg,提供类似于apt-get(但apt-cyg != apt-get,有时候出错了就乖乖用安装包维护吧)。apt-cyg安装:
1
2
wget https://raw.githubusercontent.com/transcode-open/apt-cyg/master/apt-cyg
install apt-cyg /bin
然后即可使用apt-cyg install nano
安装。
另外,可通过apt-cyg mirror
指定安装源。
1
apt-cyg mirror http://mirrors.ustc.edu.cn/cygwin/
此时可能出现
1
2
nano-4.9-1.tar.xz: 失败
sha512sum: 警告:1 个校验和不匹配
是由于wget导致的,换成lynx的话就会消失(安装lynx包卸载wget包),但是会导致更多的报错,所以还是愉快的当做看不到吧~
关于包管理器,还看到用Chocolatey管理的
1
choco install bash --source=cygwin
个人不使用这个windows包管理器,就不尝试了。
参考链接:updates - How to install new packages on Cygwin? - Super User
使用配置
把Cygwin添加到Windows Terminal中:打开WT设置,添加新配置文件,复制一个原有的比如Powershell,然后修改名称,命令,图标即可,命令修改为:D:\software-dev\cygwin\bin\bash.exe -i -l
.
然后为了其他终端获取unix命令,添加环境变量,将cygwin\bin
、cygwin\sbin
、cygwin\usr\local\bin
等加上,具体添加可自行选择一个或多个。
MSYS2
基本情况与上述Cygwin基本相同:
MSYS2是MSYS的一个升级版,准确的说是集成了pacman和Mingw-w64的Cygwin升级版, 提供了bash shell等linux环境、版本控制软件(git/hg)和MinGW-w64 工具链。与MSYS最大的区别是移植了 Arch Linux的软件包管理系统 Pacman(其实是与Cygwin的区别)。
安装可以到官网下载安装。个人是使用Choco完成的安装:
1
2
3
choco install msys2
# 会选择是否包含mingw工具链,根据提示选择默认的[1,3]
# 这里安装msys2时可能会卡在updating trust database,Ctrl+C取消然后重新运行一次即可 --force重新安装
Choco安装会自动添加到PATH中,直接使用msys2
等命令即可。
包管理器:根据介绍,msys2中集成了pacman包管理系统,直接使用pacman安装管理包即可。
Windows Terminal集成:基本操作同Cygwin,使用的命令为msys2_shell.cmd -defterm -no-start -use-full-path -here -mingw64
,具体参考这个。
轻度使用感觉Cygwin和MSYS2区别不大,但msys2自带包管理器还是更省心,同时可以打包Mingw工具链,由于个人使用Jekyll框架必须使用,所以改为使用MSYS2。大小上面差距不大,Cygwin 800M,MSYS2 900M(取决于安装包,MSYS2自带Mingw.)
Windows包管理器
类似于ubuntu上的apt,命令行获取应用,并处理应用的依赖关系,比如一个包可能会依赖于7zip,当环境中没有时,在install的时候会递归去下载这些依赖。包括有:
- winget。微软商店的网络有坑。
- scoop
- chocolatey
Scoop
安装:
Scoop 默认使用普通用户权限,其本体和安装的软件默认会放在 %USERPROFILE%\scoop(即 C:\Users\用户名\scoop),使用管理员权限进行全局安装 (-g) 的软件在 C:\ProgramData\scoop。如果有自定安装路径的需求,那么要提前设置好环境变量,否则后续再改不是一件容易的事情。
所以先设置用户安装路径
1
2
$env:SCOOP='D:\Scoop'
[Environment]::SetEnvironmentVariable('SCOOP', $env:SCOOP, 'User')
然后以非管理员权限打开powershell
1
2
3
4
5
6
7
# Change execution policy
Set-ExecutionPolicy RemoteSigned -scope CurrentUser
# Download and install scoop
iwr -useb get.scoop.sh | iex
# Add useful buckets (resembles repos in apt)
scoop bucket add extras
scoop bucket add versions
之后就可以scoop install
安装包,比如scoop install sudo
.
Chocolatey
安装和配置过程如下:
首先安装Chocolatey。这里手动指定了安装路径。
1 2 3 4 5 6 7 8 9 10 11 12
# 指定 Chocolatey 本身的安装位置 $env:ChocolateyInstall='E:\Program_Files\Chocolatey' [Environment]::SetEnvironmentVariable('ChocolateyInstall',$env:ChocolateyInstall,'Machine') # 在安装前应手动创建安装路径文件夹(若不存在) # 安装 Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1')) # 如果已经有执行脚本权限可执行以下 # iwr https://chocolatey.org/install.ps1 -UseBasicParsing | iex # 根据提示 . $PROFILE
choco使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
// 安装包 choco install <package> // 如果使用 -version 可以指定版本 // 查看安装的包 choco list -l choco list -local-only // 包的更新,包括chocolatey本身 choco upgrade <packagename> // 包的卸载 choco uninstall // 包的搜索(我更喜欢去官网的Packages页上搜) choco search
指定包路径(对于到处拉屎的行为是坚决禁止的!)。Choco安装完成后会添加
ChocolateyToolsLocation
环境变量,将其修改为需要的路径即可(针对Choco1.2版本)。
CPP包管理器
- vcpkg
- conan
其他一些包管理器
Ruby
使用RubyGems和bundler进行依赖管理。
bundler: 提供ruby依赖管理,跟踪并安装所需特定版本的gem,后面jekyll网站初始化时,bundle
从Gemfile中安装所需的依赖。