Пишем свой пакет для Chocolatey



Chocolatey — пакетный менеджер для windows сильно облегчающий процедуру установки программ, а уж сколько он экономит времени. Про это чудо уже писали на хабре и даже было показано как написать свой пакет для него, но там было больше ручной работы, я же хочу показать как можно немного упростить это дело.

Приступаем


Если у вас не установлен сам chocolatey, исправляем это:

@powershell -NoProfile -ExecutionPolicy unrestricted -Command "iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))" && SET PATH=%PATH%;%systemdrive%\chocolatey\bin

Закрываем и снова открываем консоль, чтобы освежились данные по переменным.

Chocolatey установили, теперь устанавливаем пакеты, которые нам пригодятся:

cinst warmup
cinst git
cinst nuget.commandline

Закрываем и снова открываем консоль, чтобы освежились данные по переменным.

Идем в папку с установленным сhocolatey, клонируем репозиторий с шаблонами, и переходим к нашим шаблонам.

cd %ChocolateyInstall%
git clone https://github.com/chocolatey/chocolateytemplates.git
cd chocolateytemplates\_templates

Подредактируем немного стандартные настройки


  • Указываете свое имя, оно будет использоваться в качестве автора пакета

    warmup addTextReplacement __CHOCO_PKG_OWNER_NAME__ "Your Name"
    

  • Ваш репозиторий с пакетами на github. Указывается только название акаунта и репозитория. Например: Claud/chocolatey-packages

    warmup addTextReplacement __CHOCO_PKG_OWNER_REPO__ "Your Repository"
    

  • Дальше нам нужно создать ссылки на наши шаблоны. По умолчанию они создаются в директории C:\CODE\_templates мне это не нравится, по этому я меняю ее на свою. Если вы со мной солидарны в этом вопросе, то открываем конфиг, который хранится здесь:
    c:\Chocolatey\lib\warmup.*\bin\warmup.exe.Config находим там C:\CODE\_templates и меняем на свою директорию.

Теперь можно активировать шаблоны, из которых мы будем делать наши пакеты (по существу создается ссылка на директорию с нужным шаблоном). Для этого, находясь в директории %ChocolateyInstall%\chocolateytemplates\_templates выполним команду (у меня выполняется только из под admin):

warmup addTemplateFolder chocolatey "%CD%\chocolatey"

Идем на сайт chocolatey.org, регистрируемся, заходим в свой профиль нажимаем-
“Your key is hidden for privacy, click to show.“ Видим три команды, выполняем только первую: устанавливаем API Key (если будет ругаться что nuget.exe не найден, то уберите расширение — .exe).

На это с подготовкой все, теперь можно преступать к массовому выпуску пакетов


Официальная документация рекомендует именовать все новые пакеты в нижнем регистре разделяя слова символом “-” или просто опуская пробелы. Также, сначала рекомендуется воспользоваться поиском пакета с нужной программой и только если таковой нет, делать свой.

Для хранения исходников будем использовать следующую структуру:.

packages
  |- workrave
    |- src
      |- tools
      |- workrave.nuspec
      |- …..
    |- build
  |- package-2

Находясь в директории packages выполняем:

warmup chocolatey workrave

В появившейся папке workrave создаем src и переносим в нее содержимое workrave.

Открываем файл workrave.nuspec. Это обычный xml, с описание нашего пакета. Название тегов говорит само за себя: title — название программы, которое будет выводится в списке пакетов на сайте chocolatey.org; author — создатель программы, которую вы укладываете в пакет….

Самое интересное находится в файле tools\chocolateyInstall.ps1

Код до
#NOTE: Please remove any commented lines to tidy up prior to releasing the package, including this one

$packageName = 'workrave' # arbitrary name for the package, used in messages
$installerType = 'EXE_MSI_OR_MSU' #only one of these: exe, msi, msu
$url = 'URL_HERE' # download url
$url64 = 'URL_x64_HERE' # 64bit URL here or remove - if installer decides, then use $url
$silentArgs = 'SILENT_ARGS_HERE' # "/s /S /q /Q /quiet /silent /SILENT /VERYSILENT" # try any of these to get the silent installer #msi is always /quiet
$validExitCodes = @(0) #please insert other valid exit codes here, exit codes for ms http://msdn.microsoft.com/en-us/library/aa368542(VS.85).aspx

# main helpers - these have error handling tucked into them already
# installer, will assert administrative rights

# if removing $url64, please remove from here
Install-ChocolateyPackage "$packageName" "$installerType" "$silentArgs" "$url" "$url64"  -validExitCodes $validExitCodes
# download and unpack a zip file

# if removing $url64, please remove from here
Install-ChocolateyZipPackage "$packageName" "$url" "$(Split-Path -parent $MyInvocation.MyCommand.Definition)" "$url64"

#try { #error handling is only necessary if you need to do anything in addition to/instead of the main helpers
  # other helpers - using any of these means you want to uncomment the error handling up top and at bottom.
  # downloader that the main helpers use to download items

  # if removing $url64, please remove from here
  #Get-ChocolateyWebFile "$packageName" 'DOWNLOAD_TO_FILE_FULL_PATH' "$url" "$url64"
  # installer, will assert administrative rights - used by Install-ChocolateyPackage
  #Install-ChocolateyInstallPackage "$packageName" "$installerType" "$silentArgs" '_FULLFILEPATH_' -validExitCodes $validExitCodes
  # unzips a file to the specified location - auto overwrites existing content
  #Get-ChocolateyUnzip "FULL_LOCATION_TO_ZIP.zip" "$(Split-Path -parent $MyInvocation.MyCommand.Definition)"
  # Runs processes asserting UAC, will assert administrative rights - used by Install-ChocolateyInstallPackage
  #Start-ChocolateyProcessAsAdmin 'STATEMENTS_TO_RUN' 'Optional_Application_If_Not_PowerShell' -validExitCodes $validExitCodes
  # add specific folders to the path - any executables found in the chocolatey package folder will already be on the path. This is used in addition to that or for cases when a native installer doesn't add things to the path.
  #Install-ChocolateyPath 'LOCATION_TO_ADD_TO_PATH' 'User_OR_Machine' # Machine will assert administrative rights
  # add specific files as shortcuts to the desktop
  #$target = Join-Path $MyInvocation.MyCommand.Definition "$($packageName).exe"
  #Install-ChocolateyDesktopLink $target

  #------- ADDITIONAL SETUP -------#
  # make sure to uncomment the error handling if you have additional setup to do

  #$processor = Get-WmiObject Win32_Processor
  #$is64bit = $processor.AddressWidth -eq 64


  # the following is all part of error handling
  #Write-ChocolateySuccess "$packageName"
#} catch {
  #Write-ChocolateyFailure "$packageName" "$($_.Exception.Message)"
  #throw
#}


Здесь три блока:

  • Переменные.
  • Два варианта простых установщиков. Install-ChocolateyPackage — скачивает exe файл и запускает его установку с нужными ключами. Самая ходовая команда в большинстве случаев ее должно хватить. Install-ChocolateyZipPackage — скачивает zip архив и распаковывает его в указанную директорию.
  • try / catch — это на случай сложного процесса установки. Скажем скачать zip архив, распаковать и запустить из него .exe файл.


Для нашего тестового пакета приводим код к такому виду

Код после
#NOTE: Please remove any commented lines to tidy up prior to releasing the package, including this one

$packageName = 'workrave' # arbitrary name for the package, used in messages
$installerType = 'exe' #only one of these: exe, msi, msu
$url = 'http://softlayer-ams.dl.sourceforge.net/project/workrave/workrave/1.10.1/workrave-win32-v1.10.1-installer.exe' # download url
$silentArgs = '/verysilent /norestart' # "/s /S /q /Q /quiet /silent /SILENT /VERYSILENT" # try any of these to get the silent installer #msi is always /quiet
$validExitCodes = @(0) #please insert other valid exit codes here, exit codes for ms http://msdn.microsoft.com/en-us/library/aa368542(VS.85).aspx

# main helpers - these have error handling tucked into them already
# installer, will assert administrative rights

# if removing $url64, please remove from here
Install-ChocolateyPackage "$packageName" "$installerType" "$silentArgs" "$url"  -validExitCodes $validExitCodes
# download and unpack a zip file


В workrave для тихой установки используются ключи /verysilent /norestart. Список самых распространенных ключей в общедоступных инсталяторах указан в описание к переменной $silentArgs. Кроме того, можно ознакомится с этим: unattended.sourceforge.net/installers.php

Теперь можно собрать пакет, протестировать его, и залить на chocolatey.org. Для облегчения этого процесса я написал 4 простеньких .bat файла, Копипастить код я не буду, вы их можете скачать с github.

  • 1-build-package.bat — собирает пакет
  • 2-test-package.bat — выполняет локальную установку пакета, для теста.
  • 3-push-package.bat — заливает пакет на chocolatey.org
  • 4-helper.bat — обертка над первыми тремя. Запускает сборщик, а на локальную установку и push, спрашивает делать или нет.


Т.е. для сборки нашего пакета просто, запускаем первые три .bat файла по порядку либо 4-тый.

На этом все.



Про ошибки просьба писать в ЛС.
  • +8
  • 14.9k
  • 4
Share post

Similar posts

AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 4

    –2
    Все отлично, спасибо!

    Заранее прошу прощения у тех, кого вероятно заденут мои следующие слова.

    Я очень сожалею, что не могу своим ушедшим навсегда друзьям рассказать о том, что в 2014 году развивается менеджер пакетов для Windows. Вот если честно — сижу и скорблю, что не могу поделиться этой новостью. Буквально 10-15 лет назад были весьма суровые и интереснейшие баталии по поводу инсталляторов, и не только.

    Даже не знаю, стоит-ли добавлять этот комментарий. Ладно, отправлю. Искренность рулит, наверное?
      0
      что делать тем, кто не хочет видеть папку chocolatey в корне своего %systemdrive%?
        +1
        github.com/chocolatey/chocolatey/wiki/Installation

        Смотрите начиная с этого: «Can I install chocolatey to another location? Yes „
          0
          UPD: Теперь по умолчанию это C:\ProgramData\chocolatey.
          Также можно добавить что Ketarin замечательно подходит для создания пакетов с автоматическим обновлением версии.

        Only users with full accounts can post comments. Log in, please.