Pull to refresh

Chocolatey — apt-get для Windows

Reading time6 min
Views114K
Chocolatey — менеджер пакетов в среде Windows по аналогии с apt-get в Linux Мире.



Начал использовать по причине разработки на Node.js под Nodester. Мне хотелось бы регулярно обновлять ноду, git, dropbox, да и тот же skype, при этом, не заморачиваясь со скачиванием msi инсталяторов и установками, а просто обновить одной командой:

cup all

Это возможно — обновить все пакеты. Общий список доступных команд в Wiki. К сожалению, нет возможности удалить пакеты.

Так, как для работы постоянно требуется доступ к консоли, git, node, jade. Я хотел бы немножечко проиллюстрировать работу с Chocolatey в контексте (на примере) подготовки к разработке под Nodester.

Требования для установки:

Windows XP/Vista/7/2003/2008
.NET Framework 4.0
PowerShell 2.0

Устанавливается просто, выполнением такой незамысловатой команды (в cmd.exe в PowerShell не обрабатывается):

@powershell -NoProfile -ExecutionPolicy unrestricted -Command "iex ((new-object net.webclient).DownloadString('http://bit.ly/psChocInstall'))"

Процесс установки Chocolatey

После чего автоматически устанавливается в C:\Chocolatey, в C:\Chocolatey\libs будут находится описания пакетов, библиотеки. Основные же модули программ по дефолту устанавливаются в Program Files (x86).

Все основные и необходимые, для девелопера, пакеты присутствуют. Интерпретируемые языки, типа PHP, Ruby, Python, Node.js. БД — MySQL, MongoDB, SQLite. Контроль версий Git, Mercurial, SVN. Notepad++, Sublime. Сalibre для обработки книг под Kindle.

1. Установка пакета Node.js вместе с npm

cinst nodejs.install

Эта команда аналогична следующей

chocolatey install nodejs.install



Правда консоль придется закрыть и открыть заново, что бы стали доступны записанные пути в path.



2. Когда нода установлена уже можно вести разработку, инсталлировать модули через менеджер пакетов. Вот и пакетик для Нодстера



3. Без Git-a на Nodester совершить деплой не удастся, так что устанавливаем его с помощью Chocolatey



Вот список того, что я ещё дополнительно установил.

cinst Console2
cinst putty
cinst curl
cinst Wget


Пробуем putty, команда открывает окно программы и смотрим на, то что git поставился успешно (напомню, что придется закрывать консоль и открывать заново).



4. Вот видим что к Nodester можем свободно обращаться



Дальше остается рутинный процесс, инсталяция на локальной машине через npm требуемый в проекте модулей, типа expressjs, jade, тестирование на локальном веб-сервере который загружает нода. Все это дело ведется в git, коммитится, после чего совершается push в репы nodester. На nodester-е (список команд) так же потребуется установить npm модули через nodester npm install appname.

Не для всего подходит Chocolatey. Сама идеология Windows и создаваемых под платформу приложений склоняется к тому, что они сами должны лезть в автозагрузки и при каждом удобном случае без разрешения лезть обновляться. Так, в пакетах есть Chrome, но мы то знаем про GoogleUpdater.exe который и так все обновляет. Так, же и про Notepad++ который сам может полезть за обновлениями. Skype и самому обновить можно. Однако если изначально все ставить по-шоколадному, быстрое обновление одной командой будет приносить удовольствие, особенно если это относится не к GUI инструментам.

Напоследок приложу видео ролик с оф. сайта



UPD.

В комментариях попросили добавить пакет Slik Subversion (SVN). Я думаю полезно будет проиллюстрировать, как просто это осуществляется. Также прояснится принцип работы «шоколада».

Главное описание и скрипт инсталляции для простейшего случая. Все пакеты можно собрать самому, вот примеры.

1. Создаем файл описания C:\sliksvn\sliksvn.nuspec с соответствующим текстом (исходная болванка):

<?xml version="1.0"?>
<package xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <metadata>
    <id>sliksvn</id>
    <title>SlikSVN</title>
    <version>1.7.4</version>
    <authors>Slik Company</authors>
    <owners>anatooly</owners>
    <summary>Slik subversion reliable version control starts here</summary>
    <description>We provide a standalone command line Subversion package for Windows. The installer contains all command line tools (svn, svnadmin, svnsync, svnserve, svnmucc, etc.) but no application bindings nor Apache modules. The tools are fully side-by-side compatible with other packages. Ideal for automated build and deploy scripts</description>
    <projectUrl>http://www.sliksvn.com/</projectUrl>
    <tags>sliksvn svn subversion</tags>
    <copyright>Slik Company</copyright>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
  </metadata>
</package>


2. После чего создаем скрипт инсталляции C:\sliksvn\tools\chocolateyInstall.ps1

try {

Install-ChocolateyPackage 'sliksvn' 'msi' '/quiet' 'www.sliksvn.com/pub/Slik-Subversion-1.7.4-win32.msi' 'http://www.sliksvn.com/pub/Slik-Subversion-1.7.4-x64.msi'

Write-ChocolateySuccess 'SlikSVN'
} catch {
Write-ChocolateyFailure 'SlikSVN' "$($_.Exception.Message)"
throw
}


Из кода становится понятно. Что скачивается с оф. сайта либо 32-бита, либо 64 бита инсталятор и будет ставиться в тихом режиме не отвлекая вопросами.

3. Доп. файл установки (может отсутствовать), а данном случае не принципиально C:\sliksvn\tools\install.ps1

param($installPath, $toolsPath, $package, $project)

Write-Host 'This is not a package with dlls to reference in it.'
Write-Host 'Please install using chocolatey'
Write-Host "To get chocolatey just run 'Install-Package chocolatey' followed by 'Initialize-Chocolatey'"
Write-Host 'chocolatey install sliksvn'
write-host 'Removing this package...'
uninstall-package sliksvn -ProjectName $project.Name


4. Собираем пакет. Его собрать можно NuGet-ом. Пропишите доступ к нему в path, либо обращайтесь через полный путь. Лежит в C:\Chocolatey\chocolateyInstall\NuGet.exe

> cd C:\sliksvn
> nuget pack

После чего получаем C:\sliksvn\sliksvn.1.7.4.nupkg локальный пакет. С него можно уже устанавливать, проверьте cinst sliksvn -source C:\sliksvn (в пути обязательно только путь к папке где лежит пакет, без его названия). Устанавливается локально. После чего можете загрузить пакет на сайт. Там работает режим постмодерации, так что пакет будет виден сразу и становится доступным через cinst sliksvn.

Как все работает при установке пакета? При установке, все что запаковано в пакете nupkg — скрипты установки, описание, и другие файлы, бинарные архивы (есть много интересных примеров что там может быть) попадает в папку C:\Chocolatey\lib\НАЗВАНИЕ_ПАКЕТА, а вот действия прописанные в скрипте, в нашем случае тихая установка выполняются по дефолту, то есть SlikSVN у меня 64-бита система, значит он ставится в C:\Program Files\SlikSVN\ и сам прописывается в path. Но на самом деле установка может быть любой распаковка из собственного архива, который будет входить в пакет, либо ещё какие-то действия со своими входящими библиотеками. Все зависит от фантазии.

Как его удалить? Сам SlikSVN через Установка-Удаления, как любую стандартно установленную программу, и из C:\Chocolatey\lib\НАЗВАНИЕ_ПАКЕТА руками.

Update 2012-08-15:

В последних версиях уже появилось удаление пакетов через chocolatey uninstall. По команде удаляется содержимое пакета из C:\Chocolatey\lib\ название пакета, то есть утилиты которые устанавливаются распаковываясь в эту папку удаляются полностью. То что инсталлировалось в систему и в Program Files — не трогается.

Списка установленных, как логично было бы предположить по chocolatey list пакетов — нет. Но ведь это можно легко исправить, как вариант таким хаком:

diff --git "a/c:\\Chocolatey\\chocolateyInstall\\functions\\Chocolatey-List.ps1" "b/c:\\Chocolatey\\chocolateyInstall\\functions\\Chocolatey-List.ps1"
index 67c2ecc..aa67027 100644
--- "a/c:\\Chocolatey\\chocolateyInstall\\functions\\Chocolatey-List.ps1"
+++ "b/c:\\Chocolatey\\chocolateyInstall\\functions\\Chocolatey-List.ps1"
@@ -15,7 +15,12 @@ param(
     $parameters = "list"
     if ($selector -ne '') {
       $parameters = "$parameters ""$selector"""
-    }
+    } else {
+	  $packageFolders = Get-ChildItem $nugetLibPath | sort name
+	  $packages = $packageFolders -replace "(\.\d{1,})+"|gu 
+	  Write-Host $packages
+	  exit
+	}
     
     if ($allVersions -eq $true) {
       Write-Debug "Showing all versions of packages"


Теперь по chocolatey list мы получим:

7zip 7zip.install chocolatey Console2 curl foobar2000 git git.install miranda msysgit nodejs.install notepadplusplus notepadplusplus.install php php5-dev putty sliksvn sublimetext2 warmup Wget
Tags:
Hubs:
+49
Comments57

Articles