2013-03-17 10 views
7

Sono nuovo di Nuget e sto cercando di capire di caricare il mio primo pacchetto. Finora, tutto è andato liscio. Tuttavia, sto cercando di impostare CopyToOutputDirectory su alcuni file di contenuto che voglio vivere in una sottocartella Lib. La mia directory assomiglia a questo:Nuget - Impostazione CopyToOutputDirectory sul contenuto in sottocartelle

│ Readme.txt 
│ MyPackage.nupkg 
│ MyPackage.nuspec 
│ 
├───content 
│ └───Lib 
│   native1.dll 
│   native2.dll 
│   native3.dll 
│   native4.dll 
│ 
├───lib 
│  MyActualAssembly.dll 
│ 
└───tools 
     Install.ps1 

Dalla lettura this StackOverflow question e qualche lettura in più, ho messo insieme un Install.ps1 che assomiglia a questo:

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

$project.ProjectItems.Item("Lib\native1.dll").Properties.Item("CopyToOutputDirectory").Value = 1 
$project.ProjectItems.Item("Lib\native2.dll").Properties.Item("CopyToOutputDirectory").Value = 1 
$project.ProjectItems.Item("Lib\native3.dll").Properties.Item("CopyToOutputDirectory").Value = 1 
$project.ProjectItems.Item("Lib\native4.dll").Properties.Item("CopyToOutputDirectory").Value = 1 

I 1-allineati alle varie operazioni da vedi se mi ha aiutato a capire il problema, ma è praticamente la stessa di quella risposta altrimenti.

Dai miei test, Install.ps1 ha qualche problema nel trovare i file stessi. Quando viene eseguito dopo aver installato il pacchetto, ottengo i seguenti errori:

Exception calling "Item" with "1" argument(s): "The parameter is incorrect. (Exception from HRESULT: 0x80070057 
(E_INVALIDARG))" 
At C:\...\tools\Install.ps1:3 char:1 
+ $project.ProjectItems.Item("Lib\native1.dll").Properties.Item("CopyToOutputDirect ... 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : NotSpecified: (:) [], MethodInvocationException 
    + FullyQualifiedErrorId : ComMethodTargetInvocation 

Exception calling "Item" with "1" argument(s): "The parameter is incorrect. (Exception from HRESULT: 0x80070057 
(E_INVALIDARG))" 
At C:\...\tools\Install.ps1:4 char:1 
+ $project.ProjectItems.Item("Lib\native2.dll").Properties.Item("Copy ... 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : NotSpecified: (:) [], MethodInvocationException 
    + FullyQualifiedErrorId : ComMethodTargetInvocation 

Exception calling "Item" with "1" argument(s): "The parameter is incorrect. (Exception from HRESULT: 0x80070057 
(E_INVALIDARG))" 
At C:\...\tools\Install.ps1:5 char:1 
+ $project.ProjectItems.Item("Lib\native3.dll").Properties.Item("CopyToOutputDirec ... 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : NotSpecified: (:) [], MethodInvocationException 
    + FullyQualifiedErrorId : ComMethodTargetInvocation 

Exception calling "Item" with "1" argument(s): "The parameter is incorrect. (Exception from HRESULT: 0x80070057 
(E_INVALIDARG))" 
At C:\...\tools\Install.ps1:6 char:1 
+ $project.ProjectItems.Item("Lib\native4.dll").Properties.Item("CopyToOut ... 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : NotSpecified: (:) [], MethodInvocationException 
    + FullyQualifiedErrorId : ComMethodTargetInvocation 

E, come ci si aspetta, tutti i file hanno la loro impostazione CopyToOutputDirectory impostato come Non copiare, l'impostazione predefinita.

Come si risolve? C'è una sintassi diversa per accedere alle sottocartelle negli script ps? O mi manca completamente il punto di questi messaggi di errore?

risposta

10

provare la seguente invece:

$project.ProjectItems.Item("Lib").ProjectItems.Item("native1.dll").Properties.Item("CopyToOutputDirectory").Value = 1 

potrei sbagliarmi, ma non credo che ProjectItems permetteranno di individuare gli elementi che non sono figli diretti della voce corrente. Quindi è necessario trovare prima l'elemento del progetto della cartella Lib e quindi cercare all'interno di questo elemento del progetto la tua dll.

per testare queste solito aprire la finestra Console Package Manager, assicurarsi che il progetto corretto sia selezionato nel progetto predefinito discesa elenco e quindi accedere all'oggetto progetto utilizzando la riga di comando:

$ progetto = Get-Project

Questo ti dà la stessa cosa che fa lo script di installazione NuGet che è il modello a oggetti di Visual Studio per il progetto.

+0

Scusa l'ultimo commento, ho solo riletto la tua risposta e ho perso il primo punto in cui hai ottenuto prima la Lib e poi la dll. Dal giocare nella console PM usando l'idea del progetto get, sembra che sia corretto. Ora lo proverò per davvero! –

+0

Bingo! Dopo un falso avvio con Visual Studio che mi diceva che l'esecuzione dello script era disabilitata, ho riavviato e ora l'importazione funziona senza problemi e i file hanno la loro proprietà impostata correttamente. Grazie. –