2016-02-03 13 views
8

Zrobiłem bibliotekę, która zależy od CEFsharp, który wymaga zbudowania biblioteki dla konkretnych platform. Więc nie ma wsparcia AnyCPU.Dodawanie bibliotek x86 i x64 do pakietu NuGet

Teraz chcę spakować to w NuGet. O ile rozumiem, musisz umieścić te pliki w folderze kompilacji i mieć plik .targets, który wybiera poprawną bibliotekę DLL w celu odniesienia. Więc skończyło się z pakietem Nuget wygląda tak:

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

umieścić następującą wewnątrz pliku .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> 

tak daleko tak dobry. Teraz problem. Po dodaniu tego Nuget do nowego projektu WPF, widzę odniesienie do biblioteki pojawiające się w pliku .csproj jak:

<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> 

Chociaż nie widzę niczego wspomniało o pliku .targets. Czy to nadal jest sposób na zrobienie tego z NuGet 3? Czy zrobiłem coś nie tak? Obecnie kończy się to niepowodzeniem w środowisku wykonawczym podczas uruchamiania x64 z powodu odniesienia do biblioteki x86.

+0

Jeśli nie potrzebujesz obsługi nowszych projektów systemu Windows 10 korzystających z project.json, po prostu spróbuj usunąć katalog lib \ Net45. NuGet powinien zainstalować się w projekcie WPF i po prostu zaimportować plik .targets do pliku projektu (.csproj). –

+0

Nie planuję wspierać projektów UWP ani żadnych nowszych projektów korzystających z nowych rzeczy project.json. Będę próbował jutro ponownie. Jednak nadal nie zdziwił się, że cele są przywoływane w pliku csproj, w którym został dodany nuget. – Cheesebaron

+0

Próbowałem usunąć folder lib \ net45, który nie zrobił nic, ale sprawiał, że nie był w ogóle zbudowany, ponieważ nie mógł znaleźć biblioteki dll. – Cheesebaron

Odpowiedz

11

Po tym, jak przezwyciężyłem to zbyt długo, odkryłem to.

Najwyraźniej pliki build.prop i build.target muszą mieć dokładnie taką samą nazwę jak pakiet NuGet, w przeciwnym razie nie zostaną dodane w pliku csproj.

EDIT:

Stworzyłem small github repository pokazujący jak to wykorzystać dla własnego projektu.

Demonstruje rozwiązanie z 3 projektami, jeden dla systemu iOS dla systemu Android i Net45, który jest kierowany zarówno na x86, jak i na x64.

Uwaga, w pliku .props. Ścieżki wskazują na strukturę folderów rozpakowanego NuGeta. Ścieżki te są mapowane do tego, co umieściłeś w swoim pliku nuspec.

Tak jak w repo, zdefiniować nuspec jak:

<?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> 

kładę moje pliki x86 i x64 w build\x86 plików w build\x64. Nazwa folderu może zasadniczo w tym przypadku być dowolna dla tych plików. Liczy się to, że plik rekwizytów, poniżej wskazuje na te foldery dla poszczególnych platform.

Nie jestem pewien, czy umieszczenie biblioteki x86 w lib\net45 ma znaczenie. Możesz eksperymentować z tym. Plik rekwizytów powinien wybrać odpowiedni dla ciebie.

<?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> 

W tym przypadku $(MSBuildThisFileDirectory) byłby folder build\net45\, upewnij się, że ścieżka słusznie wskazuje na dll. W tym miejscu ważny jest folder build\net45. W ten sposób NuGet automatycznie importuje pliki celów i rekwizytów.

Należy również zauważyć, że nazwa My.Awesome.Library jest dość spójna. Ważne jest to, że nazwa twojego pliku rekwizytów pasuje do identyfikatora pakietu NuGet. W przeciwnym razie wydaje się, że NuGet nie zaimportuje go.

Powiązane problemy