2016-02-03 9 views
8

Ho creato una libreria che dipende da CEFsharp che richiede la creazione della libreria per piattaforme specifiche. Quindi nessun supporto AnyCPU.Aggiunta di librerie x86 e x64 al pacchetto NuGet

Ora voglio comprimere questo in un NuGet. Per quanto ho capito, devi mettere questi file nella cartella build e avere un file che seleziona la dll corretta per fare riferimento. Così ho finito con un pacchetto NuGet simile a questo:

lib 
    monodroid 
     MyLib.dll 
    xamarin.ios10 
     MyLib.dll 
    net45 
     MyLib.dll (x86) 
build 
    net45 
     x86 
      MyLib.dll (x86) 
     x64 
      MyLib.dll (x64) 
     MyLib.targets 

ho messo il seguente all'interno del file .targets:

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <Target Name="PlatformCheck" BeforeTargets="InjectReference" 
    Condition="(('$(Platform)' != 'x86') AND ('$(Platform)' != 'x64'))"> 
    <Error Text="$(MSBuildThisFileName) does not work correctly on '$(Platform)' platform. You need to specify platform (x86 or x64)." /> 
    </Target> 

    <Target Name="InjectReference" BeforeTargets="ResolveAssemblyReferences"> 
    <ItemGroup Condition="'$(Platform)' == 'x86' or '$(Platform)' == 'x64'"> 
     <Reference Include="MyLib"> 
     <HintPath>$(MSBuildThisFileDirectory)$(Platform)\MyLib.dll</HintPath> 
     </Reference> 
    </ItemGroup> 
    </Target> 
</Project> 

Fin qui tutto bene. Ora al problema. Quando si aggiunge questo NuGet ad un nuovo progetto WPF, vedo il riferimento alla libreria che appaiono nel file .csproj come:

<Reference Include="MyLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=d64412599724c860, processorArchitecture=x86"> 
    <HintPath>..\packages\MyLib.0.0.1\lib\net45\MyLib.dll</HintPath> 
    <Private>True</Private> 
</Reference> 

Anche se io non vedo nulla di cui circa il file .targets. Questo è ancora il modo di farlo con NuGet 3? Ho fatto qualcosa di male? Attualmente questo non riesce in fase di esecuzione quando si esegue x64 a causa del riferimento alla lib di x86.

+0

Se non è necessario per supportare le più recenti di Windows 10 progetti che utilizzano project.json vorrei solo provare a rimuovere la lib \ Net45. NuGet dovrebbe installare in un progetto WPF e importare semplicemente il file .targets nel file di progetto (.csproj). –

+0

Non ho intenzione di supportare UWP o altri progetti più recenti che utilizzano il nuovo project.json stuff. Ci riproverò domani. Tuttavia, rimane perplesso di non vedere i target a cui si fa riferimento nel file csproj in cui è stato aggiunto il nuget. – Cheesebaron

+0

Ho provato a rimuovere la cartella lib \ net45, che non ha fatto altro che non averlo generato perché non riesce a trovare la DLL. – Cheesebaron

risposta

11

Dopo aver manipolato questo per troppo tempo l'ho capito.

Apparentemente i file build.prop e build.target devono avere lo stesso nome esatto del pacchetto NuGet, altrimenti non verranno aggiunti nel file csproj.

EDIT:

Ho creato un small github repository che mostra come utilizzare questo per il proprio progetto.

Dimostra una soluzione con 3 progetti, uno per iOS uno per Android e un Net45 che ha come target sia x86 che x64.

Avviso, nel file .props. I percorsi puntano alla struttura delle cartelle del NuGet decompresso. Quindi questi percorsi si associano a ciò che hai inserito nel tuo file nuspec.

Così come nel pronti contro termine, si definisce una nuspec come:

<?xml version="1.0"?> 
<package> 
    <metadata> 
    <id>My.Awesome.Library</id> 
    <version>1.0.0</version> 
    <title>My Awesome Library</title> 
    <description>Herpa Derpa</description> 
    </metadata> 
    <files> 
    <file src="My.Awesome.Library.Droid\bin\Release\My.Awesome.Library.*" 
     target="lib\monodroid70" /> 

    <file src="My.Awesome.Library.iOS\bin\Release\My.Awesome.Library.*" 
     target="lib\xamarin.ios10" /> 

    <file src="My.Awesome.Library.Net45\bin\x64\Release\My.Awesome.Library.*" 
     target="build\x64" /> 

    <file src="My.Awesome.Library.Net45\bin\x86\Release\My.Awesome.Library.*" 
     target="build\x86" /> 
    <file src="My.Awesome.Library.Net45\bin\x86\Release\My.Awesome.Library.*" 
     target="lib\net45" /> 

    <file src="My.Awesome.Library.props" target="build\net45" /> 
    </files> 
</package> 

ho messo i miei file x86 in build\x86 e x64 file in build\x64. Il nome della cartella build potrebbe essere essenzialmente qualsiasi cosa in questo caso, per questi file. Ciò che importa qui è che il file di oggetti di scena, sotto i punti in queste cartelle per le rispettive piattaforme.

Non sono sicuro se mettere la lib di x86 in lib\net45 sia importante. Puoi sperimentare con quello. Il file degli oggetti di scena dovrebbe scegliere quello giusto per te comunque.

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <ItemGroup> 
    <Reference Include="My.Awesome.Library" Condition="'$(Platform)' == 'x86'"> 
     <HintPath>$(MSBuildThisFileDirectory)..\x86\My.Awesome.Library.dll</HintPath> 
    </Reference> 
    <Reference Include="My.Awesome.Library" Condition="'$(Platform)' == 'x64'"> 
     <HintPath>$(MSBuildThisFileDirectory)..\x64\My.Awesome.Library.dll</HintPath> 
    </Reference> 
    </ItemGroup> 
</Project> 

In questo caso $(MSBuildThisFileDirectory) sarebbe la cartella build\net45\, assicurarsi che il proprio percorso indica correttamente le DLL. La cartella build\net45 è importante qui. In questo modo NuGet importa automaticamente obiettivi e file di oggetti di scena.

Anche notare il nome My.Awesome.Library è abbastanza costante tutto intorno. Ciò che è importante qui è che il nome del file dei tuoi oggetti di scena corrisponde all'ID del pacchetto NuGet. Altrimenti sembra che NuGet non lo importerà.