Как использовать EXE-файл в пакете Chocolatey из ChocolateyInstall.ps1?

Я создаю автономный пакет Chocolatey. Папка пакета содержит: app.nuspec, app.exe, app.nupkg и подпапку tools. chocolateyInstall.ps1 выглядит так:

$packageName = 'app'
$fileType = 'exe'
$silentArgs = '/VERYSILENT'
$url = '../app.exe' # the location of the file relative to the tools folder

Install-ChocolateyPackage $packageName $fileType $silentArgs $url

Когда я бегу:

choco install app -y

Я получил:

Copy-Item : cannot find the path C:\ProgramData\app.exe because does not exist

Как я могу заставить это работать? Я немного читал о «создании автономного пакета с прокладками», но я действительно не понимаю, как это использовать? Любая помощь? благодарю вас

РЕДАКТИРОВАТЬ 1

Я также нашел это другое решение здесь (http://patrickhuber.github.io/2015/03/19/creating-enterprise-versions-of-public-chocolatey-packages.html), который работает. Итак, в моем случае это будет:

$directory = $PSScriptRoot
$packageName = 'app'
$fileType = 'exe'
$silentArgs = '/VERYSILENT'
$url = Join-Path $directory '..\app.exe'     


Install-ChocolateyPackage $packageName $fileType $silentArgs $url 

Мне было интересно, что такое переменная $PSScriptRoot?


person diegus    schedule 22.03.2016    source источник
comment
Это не работает с относительными путями. Взгляните на ответ Гэри ниже. Также имейте в виду, что choco new pkgname генерирует все, что вам нужно для правильного понимания.   -  person ferventcoder    schedule 23.03.2016
comment
$PSScriptRoot — это то же самое, что и $(Split-Path $MyInvocation.MyCommand.Path), но это автоматическая переменная, доступная в PowerShell v3+. Мы рекомендуем вам использовать старый метод — если у вас есть только компьютеры с версией 3+ (например, Windows 8/Windows 2012 и более поздние версии или обновление WMF на всех других ваших машинах), то вы можете без проблем использовать $PSScriptRoot.   -  person ferventcoder    schedule 23.03.2016


Ответы (2)


Для создания пакета Chocolatey, содержащего exe/msi, вы можете использовать вспомогательный метод Install-ChocolateyInstallPackage, а не вспомогательный метод Install-ChocolateyPackage. Это задокументировано на вики Chocolatey здесь

Это работает почти так же, как и другой вспомогательный метод, за исключением того, что он не хочет/не должен загружать exe/msi. Он использует предоставленный путь и устанавливает оттуда.

Полный пример того, что требуется, можно найти в пакете ChocolateyGUI, который делает очень похожую вещь.

Суть этого показана ниже для справки:

$packageName = 'ChocolateyGUI'
$fileType = 'msi'
$silentArgs = '/quiet'
$scriptPath =  $(Split-Path $MyInvocation.MyCommand.Path)
$fileFullPath = Join-Path $scriptPath 'ChocolateyGUI.msi'

Install-ChocolateyInstallPackage $packageName $fileType $silentArgs $fileFullPath
person Gary Ewan Park    schedule 22.03.2016

Каким-то образом нам все еще не хватает объяснения путей относительно скрипта и вызывающей стороны. В этом случае Chocolatey выполняется из

%PROGRAMDATA%\Chocolatey\choco.exe

Ваш скрипт говорит ему подняться на один уровень и искать app.exe, это

%PROGRAMDATA%\app.exe

Что подразумевает ответ Гэри, используя $MyInvocation, так это то, что вам нужно построить этот путь относительно местоположения сценария, а не местоположения вызывающего абонента. Вы нашли другой способ сделать это, соединив путь с $PSScriptRoot.

Обе эти переменные известны как "Автоматические переменные".

$MyInvocation

Содержит информацию о текущей команде, такую ​​как имя, параметры, значения параметров, а также информацию о том, как команда была запущена, вызвана или «вызвана», например имя сценария, вызвавшего текущую команду.

$MyInvocation заполняется только для сценариев, функций и блоков сценариев. Вы можете использовать информацию в объекте System.Management.Automation.InvocationInfo, которую $MyInvocation возвращает в текущем сценарии, например путь и имя файла сценария ($MyInvocation.MyCommand.Path) или имя функции ($ MyInvocation.MyCommand.Name), чтобы идентифицировать текущую команду. Это особенно полезно для поиска имени текущего скрипта.

А также

$PSScriptRoot

Содержит каталог, из которого запускается скрипт.

В Windows PowerShell 2.0 эта переменная допустима только в модулях сценариев (.psm1). Начиная с Windows PowerShell 3.0, он действителен во всех сценариях.

person Anthony Mastrean    schedule 23.03.2016
comment
Спасибо за ваше объяснение. Теперь это имеет для меня больше смысла. - person diegus; 23.03.2016