如何通过命令行安装cygwin组件?

208

在Cygwin软件包中是否有类似于Debian上的apt-get或RedHat上的yum的工具,允许我通过命令行安装组件?

9个回答

161

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

例如,使用setup-x86.exe -q -P packagename1,packagename2来进行无需GUI交互的软件包安装(“无人值守安装模式”)。

(需要根据情况选择使用setup-x86.exesetup-x86_64.exe。)

请参阅https://cygwin.com/packages/获取软件包列表。


6
好的!setup.exe现在被称为setup-x86.exe,或者根据CPU位数有不同变体。此外,请参考此处的软件包列表http://cygwin.com/packages/。 - ErichBSchulz
3
为了指定多个软件包,请用逗号分隔它们。例如,在DOS中,输入“setup-x86_64 --packages="openssh,python"`。请注意,翻译的内容与原文意思相同,但更通俗易懂。 - Michael Scheper
1
@Pacerier,不清楚你在问什么。这应该是设置的一个功能,可以放心依赖。 - jturney
1
https://sourceware.org/git/?p=cygwin-setup.git;a=blob;f=package_meta.cc;h=1c6183c638d059a3236c76c18d5dc56d4be75e3c;hb=HEAD#l351 显示-P接受packageName = version对。功能公告在https://cygwin.com/pipermail/cygwin-announce/2021-April/010021.html。 - Mike Kaganski
1
只是为了明确,-P packagename=version是一个新功能。只有-P packagename已经被接受了很长时间(而且仍然是这样)... - jturney
显示剩余2条评论

143

为了获得更便捷的安装程序,您可能想要使用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

19
显然,对于64位Windows,使用setup-x86_64.exe -q -P wget,tar,qawk,bzip2,subversion,vim。 - Arun
4
需要在wget命令中添加--no-check-certificate选项。否则,非常好。 - akauppi
1
现在变成了 404 错误(经过几次重定向)。 - Shadow
4
cygwin默认没有安装wget,这意味着需要手动非程序化地安装才能引导它。 - user284244
1
wget,lynx,setup-x86.exe,setup-x86_64.exe 未被识别为内部或外部命令。现在怎么办?安装了 cygwin 后,我应该做什么第一件事?我对所有这些步骤感到非常困惑。有什么建议吗? - AIon
显示剩余4条评论

111

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

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

请查看该项目的问题选项卡以查看已知问题。


好问题。实际上,我并不完全确定答案。 - Zorobabel
4
因为你没有帮助他们成熟,所以他们不能自行编写。必须有人来处理它们。由于它们的可用性相当有限(要覆盖Windows中当前正在使用的文件,您必须首先关闭Cygwin,所以在关闭的Cygwin中无法执行任何包管理器:),因此没有太多人感兴趣。 - David Ferenczy Rogožan
15
另一个答案中提到:setup-x86.exe -q -P packagename1,packagename2。虽然不像 apt-get 或者 apt-cyg 那么花哨,但在大多数情况下可以解决问题。你也可以在关闭Cygwin后从 cmd.exe 运行此命令。 - the
2
@Steve,Dawid的答案称其已经转移到"sage"。https://dev59.com/WGox5IYBdhLWcg3wWjHQ#23143997 - eel ghEEz
3
由于原项目已经停止维护,我建议看一下(截至本评论发布时)活跃的分支:https://github.com/kou1okada/apt-cyg - Vladimir Panteleev
显示剩余2条评论

59
存在一些脚本可用作Cygwin的简单软件包管理器。但需要知道的是,它们总是会受到限制,因为......嗯......Windows。
安装或卸载软件包很容易,每个Cygwin的软件包管理器都可以做到这一点。但更新非常麻烦,因为Windows不允许覆盖当前正在运行的可执行文件。因此,您无法从Cygwin本身更新例如Cygwin DLL或包含当前正在运行的可执行文件的任何软件包。 Cygwin Installation 页面上还有这个说明:
"没有更全面的软件包管理器的基本原因是这样一个程序需要完全访问Cygwin的POSIX功能。然而,在第一次安装时存在于无Cygwin环境中,提供这种功能是困难的。此外,Windows不易允许覆盖正在使用DLL的包管理器的新版本Cygwin DLL的安装问题。"
Cygwin的安装程序使用Windows注册表来覆盖正在使用的可执行文件,这种方法需要重新启动Windows。因此,在更新软件包之前最好关闭所有Cygwin进程,这样您就不必重新启动计算机才能实际应用更改。安装新软件包应该完全没有任何问题。我认为除了Cygwin的setup.exe之外,没有任何软件包管理器实现覆盖正在使用的文件的方法,因此,如果无法覆盖它们,它将无法正常运行。

一些Cygwin的软件包管理器:

apt-cyg

更新:由于版权问题(DMCA下架),该软件库最近已被禁用。 看起来 软件库的所有者在自己的软件库上发布了DMCA下架申请,并创建了一个名为Sage的新项目(见下文)。

对我来说,这是最好的选择。因为它是最近的其中之一。它不使用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

还有各种不同功能的分支


sage

另一个以shell脚本实现的软件包管理器。我没有尝试过,但它看起来确实不错。

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


cyg-apt

这是原始cyg-apt的分支版本,改进和修复了一些bug。它具有相当多的功能,并且是用Python实现的。安装使用make完成。


Chocolatey的cyg-get

如果您使用Chocolatey安装Cygwin,您可以安装包cyg-get,它实际上是一个简单的PowerShell包装器,围绕Cygwin的setup.exe构建而成。


Cygwin的setup.exe

它还有一个命令行模式。此外,它允许您一次性升级所有已安装的软件包(就像Debian基于Linux的apt-get upgrade一样)。

使用示例:

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

5
“Sage”是“apt-cyg”的一个分支,由过去一两年中最活跃的贡献者之一(Steven Penny)创建。今年早些时候,他与原来的“apt-cyg”作者(Stephen Jungels)发生了一些分歧,并在分支项目时发布了DMCA下架通知。由于Jungels(又名Transcode)可以证明是该项目的原始作者,因此GitHub很快恢复了原始项目。目前,这两个项目都可用 - 尽管自从分裂以来,原始项目没有任何新代码更新。这真是一种混乱的情况。 - Anthony Geoghegan
setup-x86_64.exe -q --packages=bash,vim。这种方法过去曾帮助过我,只需从命令行运行它即可顺畅工作。 - TheWalkingData
Sage项目不再托管在GitHub上,至少不是在那个URL上。我已经提交了一个编辑,用存档URL替换了它,但我不知道该项目是否仍存在于其他位置。 - AJM

13

首先,下载安装程序: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

我正在使用一种非常类似的方法,对我来说效果非常好,只要您事先知道要安装的软件包的名称就可以了;-) - Gary Doublé
非常简单的解决方案。只需将别名添加到.bashrc文件中即可。 - Ach J
这太简单了,太棒了。向你致敬! - calm-tedesco

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

安装程序可以用于从本地缓存目录安装。请注意,为了使此功能正常工作,我需要将以前的Cygwin软件包缓存中的setup.ini复制到已下载文件的目录中(否则安装程序不知道哪个是哪个)。

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 Thompson

4
达维德·费伦齐的回答非常全面,但在我尝试了他几乎所有的选项后,我发现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>>"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接