2016-03-22 7 views
2

Ich baue ein in sich geschlossenes Chocolatey-Paket. Der Paketordner enthält: app.nuspec, app.exe, app.nupkg und den tools Unterordner. Die chocolateyInstall.ps1 ist wie folgt:Wie verwende ich eine EXE im Chocolate-Paket von 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 

Wenn ich laufen:

choco install app -y 

ich:

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

Wie kann ich diese Arbeit machen? Ich habe ein wenig darüber gelesen, wie man ein eigenständiges Paket mit Shims erstellt, aber ich verstehe nicht, wie man das benutzt. Irgendeine Hilfe? danke

EDIT 1

ich auch hier, um diese andere Lösung gefunden haben (http://patrickhuber.github.io/2015/03/19/creating-enterprise-versions-of-public-chocolatey-packages.html), die Arbeit macht. Also in meinem Fall das wäre:

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


Install-ChocolateyPackage $packageName $fileType $silentArgs $url 

Ich frage mich, was ist die $PSScriptRoot Variable?

+0

Es funktioniert nicht mit relativen Pfaden. Sehen Sie sich Garys Antwort unten an. Denken Sie auch daran, dass "choco new pkgname" alles generiert, was Sie brauchen, um dies richtig zu machen. – ferventcoder

+1

'$ PSScriptRoot' ist dasselbe wie' $ (Split-Path $ MyInvocation.MyCommand.Path) ', aber eine automatische Variable, die in PowerShell v3 + verfügbar ist. Wir empfehlen Ihnen, die ältere Methode zu verwenden - wenn Sie nur Computer ab 3+ haben (Windows 8/Windows 2012 oder höher oder WMF auf allen anderen Rechnern aktualisieren), dann können Sie '$ PSScriptRoot' ohne Probleme verwenden . – ferventcoder

Antwort

3

Zum Ausführen eines Chocolatey-Pakets, das die exe/msi enthält, können Sie die Hilfsmethode Install-ChocolateyInstallPackage anstelle der Hilfsmethode Install-ChocolateyPackage verwenden. Dies ist im Chocolatey Wiki dokumentiert here

Dies funktioniert sehr ähnlich wie die andere Hilfsmethode, mit der Ausnahme, dass es die exe/msi nicht herunterladen will/muss. Es verwendet den Pfad, den es bereitstellt, und installiert von dort aus.

Sie können ein komplettes Beispiel finden, was in der ChocolateyGUI package erforderlich ist, die eine sehr ähnliche Sache macht.

Die Crux ist unten als Referenz gezeigt:

$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

überprüfen Sie bitte die Änderung. Ich werde jetzt versuchen, Ihren Code .. – diegus

2

Irgendwie sind wir immer noch die Erklärung von Script- und Anrufer-relativen Pfaden fehlen. In diesem Fall von ausführt Chocolatey

%PROGRAMDATA%\Chocolatey\choco.exe 

Ihr Skript wird es erzählt eine Ebene zu gehen und suchen Sie nach app.exe, das ist

%PROGRAMDATA%\app.exe 

Was Gary Antwort impliziert, durch $MyInvocation ist, dass Sie benötigen um diesen Pfad relativ zum Speicherort des Skripts und nicht zum Speicherort des Aufrufers zu erstellen. Sie haben eine andere Methode gefunden, dies zu tun, indem Sie den Pfad mit $PSScriptRoot verbinden.

Diese beiden Variablen sind als "Automatic variables" bekannt.

MyInvocation $

eine Information über den aktuellen Befehl enthält, wie der Name, Parameter, Parameterwerte und Informationen darüber, wie der Befehl wurde gestartet, genannt, oder "aufgerufen", wie der Name des Skripts, das den aktuellen Befehl aufgerufen hat.

$ MyInvocation wird nur für Skripts, Funktionen und Skriptblöcke aufgefüllt. Sie können die Informationen im Objekt System.Management.Automation.InvocationInfo verwenden, die $ MyInvocation im aktuellen Skript zurückgibt, z. B. den Pfad und den Dateinamen des Skripts ($ MyInvocation.MyCommand.Path) oder den Namen von a Funktion ($ MyInvocation.MyCommand.Name), um den aktuellen Befehl zu identifizieren. Dies ist besonders nützlich, um den Namen des aktuellen Skripts zu finden.

Und

$ PSScriptRoot

Enthält das Verzeichnis, aus dem ein Skript ausgeführt wird. In Windows PowerShell 2.0 ist diese Variable nur in den Skriptmodulen (.psm1) gültig. Ab Windows PowerShell 3.0 ist es in allen Skripts gültig.

+0

Vielen Dank für Ihre Erklärung .. Es macht mehr Sinn für mich jetzt – diegus