2011-12-12 15 views
22

Sto creando il pacchetto NuGet e per questo ho creato il file manifest Nuspec. Nella cartella content ho due file, test.exe e test.config. Ora vorrei modificare la proprietà "Copia nella directory di output" di questi file in "Copia sempre" nel progetto, quando un utente installa questo pacchetto.NuGet: Come posso modificare la proprietà dei file con il file Install.ps1?

Ho trovato la domanda correlata NuGet how to apply properties to files, che mostra può farlo utilizzando lo script PowerShell install.ps1, ma non ho idea di come creare quel file.

risposta

37

Il file install.ps1 dovrebbe essere simile a questo.

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

$file1 = $project.ProjectItems.Item("test.exe") 
$file2 = $project.ProjectItems.Item("test.config") 

# set 'Copy To Output Directory' to 'Copy if newer' 
$copyToOutput1 = $file1.Properties.Item("CopyToOutputDirectory") 
$copyToOutput1.Value = 2 

$copyToOutput2 = $file2.Properties.Item("CopyToOutputDirectory") 
$copyToOutput2.Value = 2 
+1

// non è un commento in powershell, utilizzare # :) altrimenti molto utile, grazie – grahamrhay

+1

@brent: cercando alcuni documenti sui valori accettati per Item ("CopyToOutputDirectory") so che questo è un ence DTE ma non riesco a sembrare trovalo: -/un link al tuo riferimento sarebbe di grande aiuto per me e per chiunque trovi questa risposta. – workabyte

15

Qui è un po 'più in dettaglio su come risolvere questo problema end per finire:

Hai bisogno di fare due cose per garantire lo stato sono impostati correttamente sul installare ...

  1. Scrivere lo script install.ps1 per contrassegnare lo stato dei file.
  2. Verificare che lo script install.ps1 si trovi nella directory Tools nel pacchetto nuget.

Install.ps1 Script

Il seguente script di esempio in modo ricorsivo segnerà ogni file nella "Contenuti" e directory "vista" come "Copia di nuovo". Nota questo script di esempio è scritto per essere chiaro da leggere e capire. Contrassegna ogni file nelle cartelle Contenuto e Visualizzazioni nella directory principale del progetto Visual Studios.

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

function MarkDirectoryAsCopyToOutputRecursive($item) 
{ 
    $item.ProjectItems | ForEach-Object { MarkFileASCopyToOutputDirectory($_) } 
} 

function MarkFileASCopyToOutputDirectory($item) 
{ 
    Try 
    { 
     Write-Host Try set $item.Name 
     $item.Properties.Item("CopyToOutputDirectory").Value = 2 
    } 
    Catch 
    { 
     Write-Host RecurseOn $item.Name 
     MarkDirectoryAsCopyToOutputRecursive($item) 
    } 
} 

#Now mark everything in the a directory as "Copy to newer" 
MarkDirectoryAsCopyToOutputRecursive($project.ProjectItems.Item("Content")) 
MarkDirectoryAsCopyToOutputRecursive($project.ProjectItems.Item("Views")) 

Copia Strumenti

È necessario copiare il file nella directory install.ps1 strumenti per script da eseguire dal NuGet. È possibile aggiungere quanto segue al modello nuspec per farlo.

<files> 
    <file src="install.ps1" target="Tools"/> 
</files> 

Nota in questo caso ho il file install.ps1 nella radice del mio progetto di Visual Studio e contrassegnato come "Copia se più recente".

+0

Quanto sopra stava dando 'Eccezione chiamata" Elemento "con argomento" 1 ":" Il parametro non è corretto. (Eccezione da HRESULT: 0x80070057 (E_INVALIDARG)) " At Tools \ install.ps1: 3 char: 27 + $ project.ProjectItems.Item <<<< ("Contenuto"). ProjectItems.Item ("file.jar"). Properties.Item ("CopyToOutputDirectory"). Value = 1 + CategoryInfo: NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId: ComMethodTargetInvocation ' ho riparato questo cambiando ' MarkDirectoryAsCopyToOutputRecursive ($ Project.ProjectItems.Prodotto ("Contenuti")) ' a ' MarkDirectoryAsCopyToOutputRecursive ($ progetto)) ' – Paul

+1

@ Paolo il vostro suggerimento imposta ** ** TUTTO nel progetto per CopyIfNewer, che probabilmente non è ciò che si vuole. puoi usare '$ project.ProjectItems.Item (" ")' per impostare le proprietà solo per i file in quella cartella del tuo progetto. Questo non è al 100% chiaro dalla risposta. –

Problemi correlati