Я работаю над сценарием автоматизации Powershell, который развертывает различные зависимости в окне Windows Server (в качестве подготовки к созданию из него AMI), и одна из зависимостей - Cygwin с различными пакетами, такими как Python, Curl и т. Д.
Установить Cygwin с пакетами вручную совсем несложно, вы просто выбираете их из огромного числа доступных на одном из шагов мастера установки. Однако для сценария это нужно делать через командную строку.
FAQ Cygwin указывает различные аргументы командной строки, но я не мог понять:
--download
необходимо--packages
аргументИз других сообщений о serverfault я узнал, что это список имен пакетов, разделенных запятыми, но не смог найти рабочий пример или список допустимых имен пакетов, которые я мог бы использовать.
Идеальным решением для меня был бы способ «экспортировать» или «перенести» пакеты, которые я установил вручную, в сценарий, который я могу запустить.
В конце концов я нашел решение, которое сработало для меня, и хотел бы поделиться подробным объяснением, которое я нигде не мог найти, в надежде, что оно поможет кому-то вроде меня в будущем.
Чтобы экспортировать список, откройте 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"
удаляет первые 2 строки (содержащие заголовки таблиц) и -e "s/ .*$//"
удаляет пробелы и номера версий, поэтому вы получаете список только имен пакетов.
Наконец awk
- это язык программирования для обработки текста, и здесь он помогает распечатать список в виде одной строки, разделенной запятыми, поэтому NR==1{printf $0}
просто напечатает первую строку (первое имя пакета), а затем {printf ",&s", $0}
будет печатать каждое последующее имя пакета с ,
перед этим.
В результате получается однострочный список допустимых пакетов Cygwin, разделенных запятыми, который можно использовать для установщика из командной строки.
Аргументы, которые мне нужны для установки из командной строки, следующие:
--quiet-mode
установить в автоматическом режиме--root
чтобы определить, где на диске должен быть установлен Cygwinc:\cygwin64
--site
определить зеркало, с которого нужно скачивать файлыhttp://cygwin.mirror.constant.com
. Вы можете использовать любое зеркало из Страница Cygwin Mirrors, просто не забудьте включить 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"
В моем 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;