Как правильно создать пакет NuGet, который должен добавлять ссылки на старые сборки фреймворка?

Я пытаюсь создать пакет NuGet, который можно добавить в проект .net 4.0 или 4.5. Фактические сборки, содержащиеся в пакете, все созданы для .net 3.5, все, кроме одной, которая создана для .net 4.0 — я не могу это контролировать, поэтому я должен использовать сборки «как есть».

Проект, над которым я работаю, нацелен на .net 4.5.2, и ему необходимо ссылаться на эти «устаревшие» сборки. Я включил «активацию устаревшей среды выполнения», указав в своем App.config следующее:

  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2"/>
  </startup>

Кажется, все это работает достаточно хорошо. Теперь я хочу упаковать свои «устаревшие» сборки в пакет NuGet. Мой файл .nuspec выглядит так:

<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
    <metadata>
        <!-- many lines elided for clarity -->
        <references>
            <group>
                <reference file="NetFx35Assembly1.dll" />
                <reference file="NetFx35Assembly2.dll" />
            </group>
            <group targetFramework=".NETFramework4.5.2" >
                <reference file="NetFx40Assembly.dll" />
            </group>
         </references>
    </metadata>
    <files>
        <!-- .net 3.5 assemblies -->
        <file src="NetFx35Assembly1.dll" target="lib\net35\NetFx35Assembly1.dll" />
        <file src="NetFx35Assembly2.dll" target="lib\net35\NetFx35Assembly2.dll" />
        <!-- .net 4.0 assemblies -->        
        <file src="NetFx40Assembly.dll" target="lib\net40\NetFx40Assembly.dll" />
    </files>
</package>

Я ожидал, что когда я добавлю этот пакет в свой проект .net 4.5.2, он сделает следующее:

  1. Ссылайтесь на сборки 3.5, потому что они находятся в группе «по умолчанию», в которой не указана какая-либо структура.
  2. Ссылка на сборку 4.0, так как она указана в группе, предназначенной для 4.5.2.

Все пошло не так, как я ожидал. На самом деле я получил единственную ссылку на сборку 4.0.

Как правильно создать поведение, которое я хочу? Как сделать так, чтобы пакет NuGet обеспечивал наличие тега <startup useLegacyV2RuntimeActivationPolicy="true"> в файле App.config?


person Tim Long    schedule 15.09.2014    source источник


Ответы (1)


Для групп ссылок NuGet установит все элементы только для одной группы. Он не устанавливает группу без какой-либо указанной структуры, если есть более конкретное совпадение. Эта группа по умолчанию используется, если нет других совпадений для целевой платформы проекта.

Кроме того, я, вероятно, не стал бы явно указывать .NET 4.5.2 в пакете NuGet, если только сборки .NET 4.0 не нацелены только на .NET 4.5.2. Если они совместимы с .NET 4.0, я бы нацелил их на .NET 4.0.

        <group targetFramework="net35">
            <reference file="NetFx35Assembly1.dll" />
            <reference file="NetFx35Assembly2.dll" />
        </group>
        <group targetFramework="net40" >
            <reference file="NetFx35Assembly1.dll" />
            <reference file="NetFx35Assembly2.dll" />
            <reference file="NetFx40Assembly.dll" />
        </group>

Обратите внимание, что приведенное выше эквивалентно отсутствию ссылок, определенных в разделе метаданных, и простому использованию:

<files>
    <!-- .net 3.5 assemblies -->
    <file src="NetFx35Assembly1.dll" target="lib\net35" />
    <file src="NetFx35Assembly2.dll" target="lib\net35" />
    <!-- .net 4.0 assemblies -->        
    <file src="NetFx35Assembly1.dll" target="lib\net40" />
    <file src="NetFx35Assembly2.dll" target="lib\net40" />
    <file src="NetFx40Assembly.dll" target="lib\net40" />
</files>

Для файла app.config я бы рассмотрел использование Преобразование XML-документа, чтобы добавить элемент запуска.

person Matt Ward    schedule 16.09.2014