2012-11-18 17 views
6

Il mio provider di tipo F # non sembra funzionare se tutte le sue dipendenze non si trovano nella stessa cartella. Questo non funziona molto bene per la distribuzione di provider di tipi via nuget. Qualche suggerimento su come risolvere questo?Come si distribuisce un provider di tipo F # tramite NuGet?

Avrò errori come: errore FS3033: Il provider di tipi 'Froto.Gen.ProtoTypeProvider' ha segnalato un errore: Impossibile caricare il file o l'assembly 'Froto.Roslyn, Versione = 0.0.0.1, Cultura = neutrale, PublicKeyToken = null 'o una delle sue dipendenze. Il sistema non trova il file specificato.

Il tipo di fornitore è in questa biblioteca: pacchetti \ Froto.Gen.0.0.0.1 \ lib \ net45 \ Froto.Gen.dll

Le dipendenze sono tutti nel progetto. Se li copio tutti in pacchetti \ Froto.Gen.0.0.0.1 \ lib \ net45 \, funziona il tipo provider.

2012-11-19 Aggiornamento: Creerò un pacchetto NuGet oggi per spiegare meglio il problema.

+0

La tua DLL "Froto.Roslyn" è disponibile nel proprio pacchetto Nuget? In caso contrario, come stai assumendo che un cliente che abbassa "Froto.Gen.ProtoTypeProvider" abbia accesso alla dipendenza? Se non è disponibile, non funzionerà (ecco perché la copia di tutte le dipendenze nel pacchetto Nuget funziona). – Chris

risposta

4

Questo problema non è specifico per F #. È assolutamente necessario sia

  • nave tutte le dipendenze richieste come parte del pacchetto di NuGet
  • lasciano NuGet sapere che il pacchetto dipende da altri pacchetti che forniranno i riferimenti necessari

Un pacchetto NuGet può facilmente contenere più dll (se confezionato correttamente). Puoi leggere di più su come creare un pacchetto qui: http://docs.nuget.org/docs/creating-packages/creating-and-publishing-a-package

In caso di problemi nell'integrazione di NuGet con i progetti script di msbuild, ti consiglio di dare uno sguardo agli script utilizzati da altri progetti open source per creare i pacchetti NuGet (ad es. out FSharpX o FSharp Power Pack).

+0

Il pacchetto NuGet fa riferimento alle dipendenze richieste. Tutte le dipendenze vengono scaricate e fanno parte del progetto. La parte specifica per F # è che il provider di tipi non carica i tipi dal progetto, ma solo la stessa cartella. Mi aspettavo che fosse in grado di trovare dipendenze dal progetto. Posso includere alcune dipendenze nella stessa cartella, ma non credo di avere i diritti per includere alcune delle dipendenze come Roslyn. –

+0

@ CameronTaggart: In realtà non capisco cosa intendi per "progetto", ma presumo tu intenda un riferimento all'assembly in MSBuild/VisualStudi, che dovrebbe finire per essere copiato accanto all'assembly del progetto nel cestino/cartella. Non riesco a immaginare che i provider di tipo F # si discostino dalle regole di caricamento dell'assembly del CLR, quindi il problema dovrebbe essere facile da risolvere. Puoi indicarmi il tuo pacchetto NuGet? –

+1

Potrei effettivamente sbagliare nelle dichiarazioni precedenti, sembra in un F # I provider di tipo vengono invocati in fase di compilazione anziché in runtime. È un po 'inaspettato perché ho pensato che avrebbero funzionato in modo simile a System.Expression, che viene compilato in fase di runtime. Sembra che in effetti dovresti fare ciò che @ovatsus ha suggerito. –

3

Si è verificato un problema simile con FSharpx.TypeProviders che dipendeva da FSharpx.Core. La soluzione era usare ILMerge per unire tutte le dipendenze nel provider di tipi. Controlla la discussione in https://github.com/fsharp/fsharpx/issues/91

+0

Sarebbe utile aggiungere questo ilmerge come target di msbuild. Questo nuovo obiettivo può essere aggiunto a progetti esistenti tramite un nugget – nicolas

Problemi correlati