如何从命令行安装cygwin组件?


178

Cygwin软件包中是否有类似于apt-getDebian或yumredhat 上的工具,可让我从命令行安装组件?


2
堆栈溢出是一个用于编程和开发问题的站点。这个问题似乎与主题无关,因为它与编程或开发无关。请在帮助中心中查看我可以询问哪些主题。也许超级用户会是一个更好的地方。另请参阅我在哪里发布有关Dev Ops的问题?
jww

7
@jww,这不是秘密。
Pacerier's

Answers:


102

“ setup.exe”安装程序中没有专门提供apt-get功能的工具。但是,有适用于Cygwin的命令行软件包安装程序,可以单独下载,但是它并不完全稳定,并且依赖于变通方法。

apt-cyg:http : //github.com/transcode-open/apt-cyg

签出项目的问题标签以查看已知问题。


谢谢!我想知道的。我不知道他们为什么不成熟?
vy32 2012年

4
@ vy32:因为您没有帮助他们成熟?:)他们不能写自己。必须有人来处理它们。而且,由于它们的可用性非常有限(要覆盖Windows上当前正在使用的文件,您必须先关闭Cygwin,因此无法在封闭的Cygwin中执行任何程序包管理器:),因此没有多少人感兴趣。
David FerenczyRogožan2014年

10
从另一个答案:setup-x86.exe -q -P packagename1,packagename2。不像apt-get甚至不花哨,apt-cyg但在大多数情况下,它可以解决问题。您也可以从cmd.exe(关闭Cygwin之后)运行它。
kqw 2015年

2
@Steve,达维德(Dawid)的回答说它移到了“圣人”。 stackoverflow.com/a/23143997/80772
eel ghEEz 2016年

3
由于原始项目已死,所以我建议您查看此(截至本文发稿时
Vladimir Panteleev

136

Cygwin的安装程序接受命令行参数以从命令行安装软件包。

例如setup-x86.exe -q -P packagename1,packagename2,安装没有任何GUI交互的软件包(“无人参与安装模式”)。

(请注意,您需要使用setup-x86.exesetup-x86_64.exe视情况而定。)

有关软件包列表,请参见http://cygwin.com/packages/


5
真好!setup.exe现在称为setup-x86.exe-或取决于cpu位的变体。另请参阅此处的软件包列表cygwin.com/packages
ErichBSchulz 2014年

2
另外,要指定多个软件包,请用逗号分隔。例如,在DOS中,键入setup-x86_64 --packages="openssh,python"
Michael Scheper 2014年

似乎没有设置特定版本的方法。
CMCDragonkai '16

@jturney,这个稳定吗?
Pacerier's

1
@Pacerier,您不清楚要问什么。这应该是可以安全依赖的设置功能。
jturney

133

对于更方便的安装程序,您可能希望 apt-cyg用作软件包管理器。其语法类似于 apt-get,这是一个加号。为此,请按照上述步骤操作,然后将Cygwin Bash用于以下步骤

wget https://raw.githubusercontent.com/transcode-open/apt-cyg/master/apt-cyg
chmod +x apt-cyg
mv apt-cyg /usr/local/bin

现在apt-cyg已安装。以下是一些安装软件包的示例

apt-cyg install nano
apt-cyg install git
apt-cyg install ca-certificates

17
显然,对于64位窗口,请使用setup-x86_64.exe -q -P wget,tar,qawk,bzip2,subversion,vim。
2013年

3
需要在wget命令中添加--no-check-certificate。否则,太棒了。
akauppi 2014年

现在是404(经过几次重定向)
Shadow

刚刚尝试过wget,它下载apt-cyg没有问题。404在什么时候出现?
sagunms

1
cygwin默认未安装wget,这意味着需要使用手动和非编程安装来引导它。

51

存在一些脚本,可以将其用作Cygwin的简单程序包管理器。但是重要的是要知道,由于... ehm ... Windows ,它们总是非常有限的

安装或删除软件包很好,每个Cygwin的软件包管理器都可以做到这一点。但是更新很麻烦,因为Windows不允许您覆盖当前正在运行的可执行文件。因此,您无法更新例如Cygwin DLL或包含来自Cygwin本身的当前正在运行的可执行文件的任何程序包。Cygwin安装页面上也有此注释:

“没有更全功能的软件包管理器的基本原因是,这样的程序需要完全访问Cygwin的POSIX所有功能。但是,这在非Cygwin的环境中很难提供,例如首先存在此外,Windows不允许轻易覆盖正在使用的可执行文件,因此,在程序包管理器使用DLL的同时安装新版本的Cygwin DLL是有问题的。”

Cygwin的安装程序使用Windows注册表覆盖正在使用的可执行文件,并且此方法需要重新启动Windows。因此,最好在更新软件包之前关闭所有Cygwin进程,这样就不必重新启动计算机即可实际应用更改。新软件包的安装应该完全没有任何麻烦。除了Cygwin的setup.exe实现之外,我认为没有任何软件包管理器可以实现任何方法来覆盖正在使用的文件,因此,如果无法覆盖它们,它只会失败。


Cygwin的一些软件包管理器:

适体

更新:该存储库由于版权问题(DMCA删除)最近被禁用。它看起来像仓库的所有者发行的DMCA删除自己的信息库,并创建了一个名为新项目贤者(参见下文)。

对我来说最好的。仅仅是因为它是最新的之一。它不使用Cygwin的setup.exe,而是重新实现,setup.exe可以使用。它在x86x86_64两种平台上均正常工作。有很多带有更多或更少附加功能的货叉。例如,kou1okada fork是改进的版本之一,这确实很棒。

apt-cyg只是一个shell脚本,没有安装。只需下载(或克隆存储库),使其可执行并将其复制到PATH即可:

chmod +x apt-cyg # set executable bit
mv apt-cyg /usr/local/bin # move somewhere to PATH
# ...and use it:
apt-cyg install vim

还有一堆具有不同功能的叉子


智者

实现为Shell脚本的另一个程序包管理器。我没有尝试过,但实际上看起来不错。

它可以搜索存储库中的软件包,在类别中列出软件包,检查依赖关系,列出软件包文件等等。它具有其他程序包管理器所没有的功能。


半胱氨酸

废弃原件的叉子 半胱氨酸进行了改进和修正。它具有很多功能,并且是用Python实现的。使用安装make


Chocolatey的cyg-get

如果使用Chocolatey安装Cygwin,则可以安装cyg-get软件包,实际上是Cygwin setup.exe用PowerShell编写的简单包装。


Cygwin的setup.exe

它还具有命令行模式。而且,它允许您一次升级所有已安装的软件包(与apt-get upgrade基于Debian的Linux一样)。

使用示例:

setup-x86_64.exe -q --packages=bash,vim

您可以创建一个别名以便于使用,例如:

alias cyg-get="/cygdrive/d/path/to/cygwin/setup-x86_64.exe -q -P"

然后,例如,您可以使用以下命令安装Vim软件包:

cyg-get vim


3
sageapt-cyg过去一两年中最活跃的贡献者(史蒂芬·潘妮)的叉子。看来,今年早些时候,他与原始apt-cyg作者(Stephen Jungels)有所不同,并在分叉该项目时发布了DMCA删除书。由于Jungels(aka Transcode)确实是该项目的原始作者,因此GitHub在不久后恢复了原始项目。目前,这两个项目都可用-尽管自拆分以来原始项目没有任何新的代码更新。真的,这是一个混乱的情况。
Anthony Geoghegan

setup-x86_64.exe -q --packages = bash,vim。过去,这种方法对我有所帮助。只需从命令行运行它,即可正常运行。
TheWalkingData '17年

9

首先,从以下位置下载安装程序:https : //cygwin.com/setup-x86_64.exe(Windows 64位),然后:

# move installer to cygwin folder
mv C:/Users/<you>/Downloads/setup-x86_64.exe C:/cygwin64/

# add alias to bash_aliases
echo "alias cygwin='C:/cygwin64/setup-x86_64.exe -q -P'" >> ~/.bash_aliases
source ~/.bash_aliases

# add bash_aliases to bashrc if missing
echo "source ~/.bash_aliases" >> ~/.profile

例如

# install vim
cygwin vim

# see other options
cygwin --help

我正在使用一种与此非常类似的方法,并且对我来说效果很好,只要您知道要预先安装的软件包的名称即可;-)
GaryDoublé19年

非常简单的解决方案。刚刚将别名添加到.bashrc
Ach J

4

我想要一个类似于的解决方案apt-get --print-uris,但是不幸的是apt-cyg不能做到这一点。以下是一个解决方案,它允许我仅下载所需的软件包及其相关性,然后将其复制到目标中进行安装。这是一个bash脚本,可将输出解析apt-cyg为URI列表:

#!/usr/bin/bash

package=$1
depends=$( \
    apt-cyg depends $package \
    | perl -ne 'while ($x = /> ([^>\s]+)/g) { print "$1\n"; }' \
    | sort \
    | uniq)
depends=$(echo -e "$depends\n$package")
for curpkg in $depends; do
    if ! grep -q "^$curpkg " /etc/setup/installed.db; then
    apt-cyg show $curpkg \
        | perl -ne '
            if ($x = /install: ([^\s]+)/) { 
                print "$1\n"; 
            }
            if (/\[prev\]/) { 
                exit; 
            }'
    fi
done

上面的代码将打印出需要下载的软件包的路径(相对于cygwin镜像根目录),而忽略所有已安装的软件包。要下载它们,我将输出写入文件cygwin-packages-list,然后使用wget:

mirror=http://cygwin.mirror.constant.com/
uris=$(for line in $(cat cygwin-packages-list); do echo "$mirror$line"; done)
wget -x $uris

然后可以使用安装程序从本地缓存目录进行安装。请注意,要执行此操作,我需要setup.ini从以前的cygwin程序包缓存复制到包含已下载文件的目录中(否则安装程序不知道是什么)。


4

旧问题,但仍然有意义。这是今天对我有用的(6/26/16)。

从bash shell:

lynx -source rawgit.com/transcode-open/apt-cyg/master/apt-cyg > apt-cyg
install apt-cyg /bin

1
wgetcurl可能是一个更好的工具。(就我个人而言,我会将其安装在目录中的其他目录中,$PATH而不是在目录中/bin。)
Keith Thompson16年

3

戴维德·费伦奇(Dawid Ferenczy)的回答很完整,但是在尝试了几乎所有他的选择之后,我发现Chocolatey的cyg-get是最好的(至少是我能上班的唯一一种)。

我想安装wget,步骤是这样的:

choco install cyg-get

然后:

cyg-get wget

1

通常,在安装软件包之前,必须先知道其确切名称:

# define a string to search
export to_srch=perl

# get html output of search and pick only the cygwin package names
wget -qO- "https://cygwin.com/cgi-bin2/package-grep.cgi?grep=$to_srch&arch=x86_64" | \
perl -l -ne 'm!(.*?)<\/a>\s+\-(.*?)\:(.*?)<\/li>!;print $2'

# and install 
# install multiple packages at once, note the
setup-x86_64.exe -q -s http://cygwin.mirror.constant.com -P "<<chosen_package_name>>"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.