我正在编写一个 Powershell 自动化脚本,该脚本在 Windows Server 机上部署各种依赖项(作为从中创建 AMI 的准备),其中一个依赖项是 Cygwin,它包含各种包,例如 Python、Curl 等。
手动安装 Cygwin 及其软件包非常简单,您只需在安装向导的某个步骤中从大量可用选项中选择即可。但是,对于脚本,这需要通过命令行来完成。
Cygwin 的常见问题解答指定各种命令行参数,但我无法弄清楚:
- 我到底应该使用哪些参数,例如是否
--download
需要 --packages
最重要的是如何使用参数指定包名称
从 serverfault 上的其他帖子中,我确实发现它是一个用逗号分隔的包名称列表,但找不到可用的示例或可接受的包名称列表。
对我来说,理想的解决方案是将我通过手动过程安装的包“导出”或“迁移”到我可以运行的脚本中。
答案1
最终,我找到了一个适合自己的解决方案,并想分享我在任何地方都找不到的详细解释,希望它能够在将来帮助像我这样的人。
步骤 1:在 Cygwin 中导出已安装软件包的列表
要导出列表,请打开 Cygwin 并运行以下命令:
cygcheck -c -d | sed -e "1,2d" -e "s/ .*$//" | awk 'NR==1{printf $0}{printf ",%s", $0}'
该命令由 3 个不同的应用程序组成,cygcheck
并将sed
结果awk
从一个应用程序传输到另一个应用程序,让我们将它们分解一下:
cygcheck
是与 Cygwin 捆绑在一起的实用程序,用于验证 Cygwin 部署。
cygcheck -c -d
意思是:-c
检查软件包并-d
仅转储它们而不实际检查它们是否正常。此命令会生成正确软件包名称及其版本的 ASCII 表。
sed
是一个基于命令行的逐行文本编辑器,它可以清理输入,因此-e "1,2d"
会删除前两行(包含表头)并-e "s/ .*$//"
删除空格和版本号,这样您就会得到一个仅包含包名称的列表。
最后awk
是一种文本处理编程语言,在这里它有助于将列表打印为用逗号分隔的一行,因此NR==1{printf $0}
只会打印第一行(第一个包名称),然后{printf ",&s", $0}
打印,
其前面的每个后续包名称。
结果是一行以逗号分隔的有效 Cygwin 包列表,可用于命令行安装程序。
步骤 2:使用命令行安装
我发现命令行安装需要的参数是:
--quiet-mode
以无人值守模式安装--root
定义 Cygwin 应该安装在
我选择的驱动器上的位置c:\cygwin64
--site
定义要从中下载文件的镜像,
我使用了http://cygwin.mirror.constant.com
。您可以使用Cygwin 镜像页面,只需确保包含http://
前缀!--packages
明确定义应该安装哪些软件包
上一步创建的列表应该用双引号 ("
) 括起来,如下所示:--packages "pkg1,pkg2,pkg3"
其结果为以下命令格式:
setup-x86_64.exe --quiet-mode --root c:\cygwin64 --site http://cygwin.mirror.constant.com --packages "curl,python,python-crypto"
步骤 3:作为 Powershell 脚本的一部分运行安装程序
在我的ps1
脚本文件中,我曾经Start-Process
运行 Cygwin 安装程序并等待它完成后再运行下一个命令。
最后一行代码如下:
Start-Process "$PSScriptRoot\assets\setup-x86_64.exe" -ArgumentList "--quiet-mode --root C:\Cygwin64 --site http://cygwin.mirror.constant.com --packages `"curl,python,python-crypto`"" -Wait -NoNewWindow;