Как получить восстановление пакета NuGet для работы с локально развернутыми пакетами, хранящимися в VSIX, предназначенном для Visual Studio 2019? - PullRequest
0 голосов
/ 03 апреля 2020

Я знаю, что уже есть несколько вопросов по этой теме c, но все они кажутся устаревшими. Чтобы уточнить, я использую «новый» формат манифеста VSIX и пытаюсь следовать официальным инструкциям здесь: https://docs.microsoft.com/en-us/nuget/visual-studio-extensibility/visual-studio-templates

У меня есть один шаблон проекта и несколько шаблонов элементов, которые go с этим. Все они зависят от развертывания пакета NuGet, который должен поставляться локально в комплекте с VSIX. Я проверил полученный файл VSIX, и все файлы, кажется, находятся в правильном месте:

  1. Шаблон проекта имеет обязательный XML для объявления, какие пакеты устанавливать:
  <WizardExtension>
    <Assembly>NuGet.VisualStudio.Interop, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</Assembly>
    <FullClassName>NuGet.VisualStudio.TemplateWizard</FullClassName>
  </WizardExtension>
  <WizardData>
    <packages repository="extension" repositoryId="VsixID.etc.etc">
      <package id="Rx-Linq" version="2.2.5" />
    </packages>
  </WizardData>

repositoryID соответствует атрибуту ID в файле .vsixmanifest.

Для каждого пакета есть отдельная запись Asset с формой :

    <Asset Type="Rx-Linq.2.2.5.nupkg" d:Source="File" Path="Packages\Rx-Linq.2.2.5.nupkg" d:VsixSubPath="Packages" />

Я удалил все packages.config и все ссылки на пакеты из файла .csproj, установленного VSIX (и даже из самого проекта VSIX просто для хорошей меры).

Я проверил вывод VSIX, и в VSIX действительно есть папка Packages, содержащая все файлы .nupkg. Эта папка действительно распаковывается и копируется в папку Visual Studio Extensions.

Несмотря на все это, когда я создаю новый проект с шаблоном, VS отображает сообщение об ошибке: Failed восстановить пакет из C:\users\<pathtoextensions>\Packages.

Дело в том, что файлы .nupkg фактически присутствуют в той папке, к которой относится сообщение об ошибке.

Я искал это несколько дней и я не могу найти ссылки на лучшие практики, которые действительно работают. Кажется, что эти манифесты VSIX ориентированы на устаревший packages.config способ ведения дел, и есть дискуссии о том, как расширить их для использования PackageReference.

Может кто-нибудь вообще дать какой-либо совет о том, как мы должны продолжать идти вперед? Пакеты не должны быть развернуты с VSIX больше? Должны ли мы просто заполнить проект PackageReference записями и просто позволить пользователю разрешить их вручную?

Мне кажется, что я упускаю что-то фундаментальное, и любое понимание было бы чрезвычайно полезным.

Обновление: Я также открыл проблему в репозитории NuGet github, поскольку это явно проблема с функцией PackageRestore при восстановлении пакетов, хранящихся в установщике VSIX. Все остальное, упомянутое в этом вопросе, работает как задумано и ожидаемо, за исключением восстановления пакета.

1 Ответ

0 голосов
/ 07 апреля 2020

Как вы на самом деле включаете пакеты NuGet в шаблоны проектов Visual Studio VSIX для Visual Studio 2019?

На самом деле , нет никакого способа указать в VS шаблон проекта проект, в котором пакеты nuget могут использоваться как packages.config, так и PackageReference. Только два шаблона проекта типов управления Nuget могут быть созданы отдельно.

У меня есть простой способ, и, поскольку у вас есть некоторые проблемы с форматом PackageReference, вы можете попробовать эту функцию:

PackageReference

1) добавить эти ссылочные узлы в файл projecttemplate.csporj:

enter image description here

   <ItemGroup>
    <PackageReference Include="Rx-Linq">
      <Version>2.2.5</Version>
    </PackageReference>
  </ItemGroup>

2) Когда вы создайте проект по этому шаблону проекта, пожалуйста, отметьте эти две опции, и VS автоматически прочитает xxx.csproj, а затем восстановит соответствующий пакет nuget на основе информации, содержащейся в нем во время процесса сборки.

enter image description here

Примечание : также убедитесь, что URL-адрес nuget проверен и доступен для него из источника пакета.

packages.config

В дополнении , для packages.config, вы можете просто создать файл с именем packages.config, а затем добавить в него свою информацию nuget:

1)

2) добавьте их в projecttemplate.csproj файл:

<ItemGroup>
  <Content Include="packages.config">
  <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
 </ItemGroup>
<ItemGroup>
    <Reference Include="Rx-Linq, Version=2.2.5, Culture=neutral, PublicKeyToken=eb42632606e9261f, processorArchitecture=MSIL">
      <HintPath>..\packages\Rx-Linq.2.2.5\lib\net472\xxxxxxx.dll</HintPath>
    </Reference>
</ItemGroup>

Примечание : если у этого пакета nuget есть зависимости, вы sh также можно добавить их (описанные выше шаги) в файл packages.config и xxxx.csproj. Эта функция немного сложнее вашей, но работает. Поэтому я рекомендую использовать формат PackageReference.

Более подробную информацию вы можете найти в этой похожей проблеме .

...