2016-02-03 23 views
8

Tôi đã tạo một thư viện phụ thuộc vào CEFsharp yêu cầu xây dựng thư viện cho các nền tảng cụ thể. Vì vậy, không hỗ trợ AnyCPU.Thêm thư viện x86 và x64 vào gói NuGet

Bây giờ tôi muốn gói phần mềm này vào một NuGet. Theo tôi hiểu, bạn phải đặt các tệp này vào thư mục xây dựng và có tệp .targets chọn tệp dll chính xác để tham chiếu. Vì vậy, tôi đã kết thúc với một gói NuGet tìm kiếm như thế này:

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

tôi đặt bên sau của tập tin .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> 

Cho đến nay rất tốt. Bây giờ cho vấn đề. Khi thêm NuGet này cho một dự án WPF mới, tôi thấy tham chiếu đến thư viện xuất hiện trong tệp .csproj như:

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

Mặc dù tôi không nhìn thấy bất cứ điều gì đề cập đến các tập tin .targets. Đây có phải là cách để làm điều đó với NuGet 3 không? Tôi đã làm gì sai sao? Hiện tại, lỗi này không hoạt động khi chạy x64 do tham chiếu đến lib x86.

+0

Nếu bạn không cần hỗ trợ các dự án Windows 10 mới hơn sử dụng project.json, tôi chỉ thử xoá thư mục lib \ Net45. NuGet nên cài đặt vào một dự án WPF và chỉ cần nhập tệp .targets vào tệp dự án (.csproj). –

+0

Tôi không có kế hoạch hỗ trợ UWP hoặc bất kỳ dự án mới nào sử dụng công cụ project.json mới. Sẽ thử lại vào ngày mai. Tuy nhiên, vẫn còn khó hiểu để không nhìn thấy các mục tiêu được tham chiếu trong tệp csproj nơi mà nuget được thêm vào. – Cheesebaron

+0

Tôi đã thử xóa thư mục lib \ net45, không có gì ngoài việc làm cho nó không được xây dựng vì nó không thể tìm thấy dll. – Cheesebaron

Trả lời

11

Sau khi sử dụng cách này quá lâu, tôi đã tìm ra.

Dường như tệp build.prop và build.target cần phải có cùng tên chính xác với gói NuGet, nếu không nó sẽ không được thêm vào tệp csproj.

EDIT:

tôi đã tạo ra một small github repository cho thấy làm thế nào để sử dụng cho các dự án của riêng bạn.

Nó thể hiện giải pháp với 3 dự án, một cho iOS dành cho Android và Net45 nhắm mục tiêu cả x86 và x64.

Lưu ý, trong tệp .props. Các đường dẫn đang trỏ vào cấu trúc thư mục của NuGet đã giải nén. Vì vậy, các đường dẫn này ánh xạ tới những gì bạn đã đặt trong tệp nuspec của mình.

Vì vậy, như trong repo, bạn định nghĩa một nuspec như:

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

tôi đặt file x86 của tôi trong build\x86 và x64 file vào build\x64. Tên của thư mục xây dựng về cơ bản có thể là bất cứ điều gì trong trường hợp này, cho các tập tin này. Điều quan trọng ở đây là tệp đạo cụ, bên dưới trỏ vào các thư mục này cho các nền tảng tương ứng.

Tôi không chắc liệu có đặt x86 lib vào lib\net45 ngay cả các vấn đề hay không. Bạn có thể thử nghiệm với điều đó. Các tập tin đạo cụ nên chọn một trong những chính xác cho bạn anyways.

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

Trong trường hợp này $(MSBuildThisFileDirectory) sẽ là thư mục build\net45\, hãy chắc chắn con đường của bạn chỉ đúng tại của dll. Thư mục build\net45 rất quan trọng ở đây. Đây là cách NuGet tự động nhập các tệp mục tiêu và đạo cụ.

Cũng lưu ý rằng tên My.Awesome.Library là khá nhất quán xung quanh. Điều quan trọng ở đây là tên của tệp đạo cụ của bạn, khớp với ID gói NuGet. Nếu không, có vẻ như NuGet sẽ không nhập nó.

Các vấn đề liên quan