2016-05-17 22 views
5

Ho creato un pacchetto NuGet libtidy che viene trasferito a un feed Servizi team.Impossibile aggiungere il pacchetto NuGet

Quando provo l'installazione tramite la console NuGet ottengo l'errore

Impossibile aggiungere il riferimento a 'libtidy'

Ho letto questo Stack Overflow post in cui l'OP ha un problema simile, ma io non ho potuto risolvere il problema - Ho provato:

  • Cancellare tutte le cartelle all'interno della cartella dei pacchetti e aggiornare
  • Esecuzione regsvr32 "C:\Program Files (x86)\Common Files\microsoft shared\MSEnv\VsLangproj.olb" da un prompt dei comandi con privilegi elevati
  • Facendo Uninstall-Package libtidy -force dalla console gestore di pacchetti (questo non funziona come il pacchetto non è installato
  • git clean -dfx
  • cache di compensazione NuGet
  • rimuovere manualmente la directory libtidy nella directory .nuget

EDIT

Avere fatto un po 'di ricerca, potrebbe essere a che fare con il fatto che libtidy.dll non è un codice gestito? Infatti è ANSI-C. Nella nostra applicazione utilizziamo TidyManaged, come un wrapper, che è gestito e installato con successo tramite nuget. Attualmente se copiamo manualmente in libtidy.dll in bin, funziona bene, ma sarebbe meglio se il processo di compilazione tirasse in libtidy.dll, forse come parte dell'installazione di Tidymanaged, che al momento non fa.

EDIT2

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

$file = $project.ProjectItems.Item("libtidy.dll"); 

If ($file -eq $null) 
{ 
    $project.ProjectItems.AddFromFile("libtidy.dll"); 
    $file = $project.ProjectItems.Item("libtidy.dll"); 
} 

$file.Properties.Item("CopyToOutputDirectory").Value = [int]1; 

Edit3

Edit 3:

Sono

a) mettendo libtidy.dll e Install.ps1 in una directory chiamata nuget-libtidy nel manifesto generato da nuget spec

ho:

<?xml version="1.0"?> 
<package > 
    <metadata> 
    <id>nuget-libtidy</id> 
    <version>1.0.0</version> 
    <authors>Name</authors> 
    <owners>Name</owners> 
    <requireLicenseAcceptance>false</requireLicenseAcceptance> 
    <description>nuget-libtidy</description> 
    <copyright>Copyright 2016</copyright> 
    <tags>nuget-libtidy</tags> 
    </metadata> 
    <files> 
     <file src="libtidy.dll" target="content" /> 
     <file src="Install.ps1" target="tools" /> 
    </files> 
</package> 

Quando eseguo nuget pack ricevo il seguente avviso:

WARNING: 1 issue(s) found with package 'nuget-libtidy2'. 

Issue: Assembly outside lib folder. 
Description: The assembly 'content\libtidy.dll' is not inside the 'lib' folder and hence it won't be added as reference when the package is installed into a project. 
Solution: Move it into the 'lib' folder if it should be referenced. 

b) Quando costruiamo l'applicazione libtidy.dll viene collocato nella radice del progetto (non il contenitore) & ottenere il seguente errore nella finestra di output:

Added package 'nuget-libtidy' to 'packages.config' 
Executing script file <path>\nuget-libtidy\tools\Install.ps1'... 
Cannot add a link to the file libtidy.dll. There is already a file of the same name in this folder. 
At <path>\nuget-libtidy\tools\Install.ps1:7 char:5 
+  $project.ProjectItems.AddFromFile("libtidy.dll"); 
+  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : OperationStopped: (:) [], COMException 
    + FullyQualifiedErrorId : System.Runtime.InteropServices.COMException 

Successfully installed 'nuget-libtidy' to <Namepace> 
+0

, fornire la versione vs e qual è il service pack? – toha

risposta

4

Probabilmente si sta ottenendo questo

Impossibile aggiungere riferimento a 'libtidy'

perché avete libtidy da qualche parte all'interno della cartella lib. Installando un packag in questa cartella verrà aggiunto automaticamente un riferimento e non è possibile aggiungere direttamente un riferimento a una libreria non gestita.

Se non lo si è già, è necessario esaminare manualmente la creazione del pacchetto nuget anziché eseguirlo per progetto o assieme. Per fare questo:

  1. creare una cartella chiamata NuGet-libtidy
  2. Aggiungi libtidy.dll, TidyManaged.dll e quant'altro è necessario in questa cartella
  3. Aprire cmd e passare alla cartella appena creata
  4. Run nuget spec per creare il default manifesta Package.nuspec (sarà necessario avere NuGet aggiunto al tuo PATH variabile di ambiente
  5. Aggiungere il seguente codice XML per il file appena creato nuspec subito dopo il tag di chiusura </metadata>

    <files> 
        <file src="libtidy.dll" target="content" /> 
        <file src="TidyManaged.dll" target="lib" /> 
    </files> 
    
  6. Regolare uno qualsiasi degli altri valori necessari.

Si può chiamare fatto, comprimere e distribuire il pacchetto nuget. È necessario libtidy.dll per essere copiato nella directory di output. Ciò significa che dopo aver installato il pacchetto, dovresti navigare con il tasto destro del mouse su dipendenze \ libtidy.dll in visual studio, selezionare proprietà e impostare Copy to Output Directory a Copy Always.

Se non si desidera che tutti lo facciano, è possibile apportare ulteriori modifiche alla cartella nuget-libtidy e al file manifest. Fondamentalmente quello che dovete fare è creare un file Install.ps1 che aggiunge

<ItemGroup> 
    <Content Include="libtidy.dll"> 
     <CopyToOutputDirectory>Always</CopyToOutputDirectory> 
    </Content> 
</ItemGroup> 

al file di progetto del progetto installato.

Ecco un esempio di Install.ps1 che dovrebbe fare quello che vuoi:

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

$file = $project.ProjectItems.Item("libtidy.dll"); 

If ($file -eq $null) 
{ 
    $project.ProjectItems.AddFromFile("libtidy.dll"); 
    $file = $project.ProjectItems.Item("libtidy.dll"); 
} 

$file.Properties.Item("CopyToOutputDirectory").Value = [int]1; 

Una volta che lo script PowerShell è fatto aggiungere un'altra linea a voi file manifesto:

<file src="Install.ps1" target="tools" /> 

Non dimenticare gli script in esecuzione su Windows 10 richiede di impostare la politica di esecuzione. Suggerirei di eseguire Set-ExecutionPolicy RemoteSigned. Dopo aver eseguito questo in PowerShell, sarà necessario riavviare il sistema.

A questo punto, si dovrebbe essere in grado di impacchettare e distribuire.

EDIT

Typo trovato nel file Install.ps1.La riga 3, $file1 = $project.ProjectItems.Item("libtidy.dll"); deve essere $file = $project.ProjectItems.Item("libtidy.dll";

+0

Grazie per questa risposta molto completa. Ci proveremo. – SamJolly

+0

Abbiamo rilevato che sta copiando "libtidy.dll" nella directory principale piuttosto che nella cartella "bin". Qualche idea? – SamJolly

+0

Il file install.ps1 che va nel pacchetto sotto la cartella degli strumenti dovrebbe essere impostato per copiare il file nel contenitore di ogni generazione. Puoi controllare le proprietà per libtidy.dll e fammi sapere qual è il valore per 'copia in uscita directory' –

0

Una volta ho avuto un problema simile in cui dovevo eseguire VS con autorizzazioni elevate per installare un pacchetto nuget. Qualcosa che ha a che fare con le nostre impostazioni di sicurezza aziendale.

+0

Grazie per aver contribuito .. – SamJolly

Problemi correlati