2016-02-03 4 views
8

Я создал библиотеку, которая зависит от CEFsharp, которая требует создания библиотеки для определенных платформ. Поэтому никакой поддержки AnyCPU.Добавление библиотек x86 и x64 в пакет NuGet

Теперь я хочу упаковать это в NuGet. Насколько я понимаю, вы должны поместить эти файлы в папку сборки и иметь файл .targets, который выбирает правильную DLL для ссылки. Таким образом, я закончил с пакетом NuGet глядя, как это:

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

Я положил следующий внутри файла .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> 

До сих пор так хорошо. Теперь к проблеме. При добавлении этого NuGet в новый проект WPF, я вижу ссылку на библиотеку, появляющаяся в файле .csproj как:

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

Хотя я не вижу ничего упоминалось о файле .targets. Это еще способ сделать это с помощью NuGet 3? Я сделал что-то не так? В настоящее время это не удается во время выполнения при запуске x64 из-за ссылки на x86 lib.

+0

Если вам не нужна поддержка новых проектов Windows 10, в которых используется project.json, я просто попробую удалить каталог lib \ Net45. NuGet должен установить в проект WPF и просто импортировать файл .targets в файл проекта (.csproj). –

+0

Я не планирую поддерживать UWP или любые новые проекты, которые используют новый материал project.json. Завтра повторим попытку. Тем не менее, все еще озадачен, чтобы не видеть ссылки на объекты в файле csproj, где был добавлен nuget. – Cheesebaron

+0

Я попытался удалить папку lib \ net45, которая ничего не делала, но не создавала ее вообще, потому что она не могла найти DLL. – Cheesebaron

ответ

11

После того, как я пропустил это слишком долго, я понял это.

Очевидно, файлы build.prop и build.target должны иметь то же имя, что и пакет NuGet, иначе он не будет добавлен в файл csproj.

EDIT:

Я создал small github repository, показывающий, как использовать это для вашего собственного проекта.

Он демонстрирует решение с тремя проектами: одно для iOS для Android и Net45, предназначенное для x86 и x64.

Обратите внимание, что в .props-файле. Пути указывают на структуру папок распакованного NuGet. Таким образом, эти пути сопоставляются с тем, что вы положили в свой файл nuspec.

Так как в репо, вы определяете nuspec как:

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

Я положил x86 файлы в build\x86 и 64 файлов в build\x64. В этом случае имя сборки папки может быть в любом случае для этих файлов. Здесь важно, что файл реквизита, ниже точек в этих папках для соответствующих платформ.

Я не уверен, что установка x86 lib в lib\net45 имеет значение. Вы можете поэкспериментировать с этим. Файл реквизита должен выбрать правильный для вас в любом случае.

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

В этом случае $(MSBuildThisFileDirectory) будет папка build\net45\, убедитесь, что ваш путь правильно указывает на библиотеки DLL. Здесь важна папка build\net45. Таким образом, NuGet автоматически импортирует целевые объекты и файлы реквизита.

Также обратите внимание на то, что имя My.Awesome.Library довольно последовательное. Важно то, что имя вашего файла реквизита соответствует идентификатору пакета NuGet. В противном случае кажется, что NuGet не будет импортировать его.