我正在构建一个独立的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
变量是什么?
答案 0 :(得分:3)
对于包含exe / msi的Chocolatey包,您可以使用Install-ChocolateyInstallPackage
辅助方法,而不是Install-ChocolateyPackage
辅助方法。这在Chocolatey Wiki here
这与其他辅助方法的工作方式非常相似,但不需要/需要下载exe / msi。它使用它提供的路径,并从那里安装。
您可以找到ChocolateyGUI package中所需内容的完整示例,它的功能非常相似。
它的症结如下所示:
$packageName = 'ChocolateyGUI'
$fileType = 'msi'
$silentArgs = '/quiet'
$scriptPath = $(Split-Path $MyInvocation.MyCommand.Path)
$fileFullPath = Join-Path $scriptPath 'ChocolateyGUI.msi'
Install-ChocolateyInstallPackage $packageName $fileType $silentArgs $fileFullPath
答案 1 :(得分:2)
不知怎的,我们仍然缺少脚本和调用者相对路径的解释。在这种情况下,Chocolatey正在执行
%PROGRAMDATA%\Chocolatey\choco.exe
您的脚本告诉它上升一级并查找app.exe
,
%PROGRAMDATA%\app.exe
Gary的答案暗示,使用$MyInvocation
是你需要构建相对于脚本位置而不是调用者位置的路径。您通过使用$PSScriptRoot
加入路径找到了另一种方法。
这两个变量都称为"Automatic variables"。
$ MyInvocation
包含有关当前命令的信息,例如名称, 参数,参数值以及有关命令如何的信息 启动,调用或调用,"例如调用的脚本的名称 当前命令。
仅为脚本,函数和脚本块填充$ MyInvocation。 您可以使用System.Management.Automation.InvocationInfo中的信息 $ MyInvocation在当前脚本中返回的对象,例如路径 和脚本的文件名($ MyInvocation.MyCommand.Path)或者名称 函数($ MyInvocation.MyCommand.Name)来标识当前命令。 这对于查找当前脚本的名称特别有用。
和
$ PSScriptRoot
包含运行脚本的目录。
在Windows PowerShell 2.0中,此变量仅在脚本模块中有效 (名为.psm1)。从Windows PowerShell 3.0开始,它在所有脚本中都有效。