2016-02-03 11 views
8

Belirli platformlar için kitaplık oluşturması gereken CEFsharp'a bağlı bir kitaplık oluşturdum. Yani AnyCPU desteği yok.NuGet paketine x86 ve x64 kitaplıkları ekleme

Şimdi bunu bir NuGet'e paketlemek istiyorum. Anladığım kadarıyla, bu dosyaları derleme klasörüne koymanız ve başvuru için doğru dll'i seçen bir .targets dosyasına sahip olmanız gerekir. Bu yüzden bir Nuget paketi bu gibi bakarak ile sona erdi: Şimdiye kadar iyi

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

:

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

Ben .targets dosyanın aşağıdaki içini koydu. Şimdi sorun.

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

Ben .targets dosya hakkında söz bir şey görmüyorum rağmen: Yeni WPF projeye bu Nuget eklerken, kütüphaneye referans gibi .csproj dosyasında görünen görüyoruz. Bu hala NuGet 3 ile bunu yapmanın yolu mu? Ben yanlış bir şey mi yaptım? Şu anda bu x86 lib'in referansı nedeniyle x64 çalıştırırken çalışma zamanında başarısız oluyor.

+0

project.json kullanan daha yeni Windows 10 projelerini desteklemeniz gerekmiyorsa, lib \ Net45 dizinini kaldırmayı deneyeceğim. NuGet bir WPF projesine yüklenmeli ve sadece .targets dosyasını proje dosyasına (.csproj) içe aktarmalıdır. –

+0

UWP'yi veya yeni project.json öğelerini kullanan daha yeni projeleri desteklemeyi planlamıyorum. Yarın tekrar deneyeceğim. Yine de, nuget'in eklendiği csproj dosyasında başvurulan hedefleri görmemek yine de şaşırdı. – Cheesebaron

+0

Lib \ net45 klasörünü kaldırmayı denedim, bu da hiçbir şey yapmadı, ancak hiç yapmadı, çünkü dll'yi bulamadı. – Cheesebaron

cevap

11

Çok uzun zamandır bununla uğraştıktan sonra anladım.

Görünüşe göre, build.prop ve build.target dosyalarının, NuGet paketi ile aynı ada sahip olması gerekir, aksi halde csproj dosyasına eklenmez.

DÜZENLEME: Kendi proje için bu nasıl kullanılacağını gösteren bir small github repository yarattık

.

Bu, Android için bir iOS ve hem x86 hem de x64'ü hedefleyen Net45 için 3 proje içeren bir çözüm sunar.

.props dosyasında bildirim. Yollar, paketlenmemiş NuGet'in klasör yapısını işaret ediyor. Böylece bu yollar nuspec dosyanıza yazdıklarınızı haritalandırır.

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

ben build\x64 içine build\x86 ve x64 dosyalarında benim x86 dosyalarını koyun:

Yani repo gibi, sen gibi bir nuspec tanımlar. Bu dosyalar için klasör yapısının adı aslında bu durumda herhangi bir şey olabilir. Burada önemli olan, sahne dosyalarının aşağıda belirtilen platformlar için bu klasörlerdeki noktaları içermesidir.

X 86 lib'in bile lib\net45 içine konulup konulmadığından emin değilim. Bununla deney yapabilirsin. Sahne dosyası sizin için doğru olanı seçmelidir. Bu durumda $(MSBuildThisFileDirectory) yılında

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

, build\net45\ klasör olmak Yolunuz doğru dll 'işaret emin olur. build\net45 klasörü burada önemlidir. NuGet, otomatik olarak hedefleri içe aktarır ve dosyaları düzenler.

Ayrıca, My.Awesome.Library adının her yerde oldukça tutarlı olduğuna dikkat edin. Burada önemli olan, props dosyanızın adının, NuGet paket kimliğiyle eşleşmesidir. Aksi takdirde, NuGet onu içe aktarmayacak gibi görünüyor.