Добавление элементов уровня решения в пакете NuGet

Я хочу добавить папки решений и элементы решения (не проекты) в файл решения через пакет NuGet. Я предполагаю, что это будет достигнуто через Powershell. Я просмотрел документацию для NuGet, Powershell и EnvDTE и не могу понять:

  • Какие команды/методы я буду использовать?
  • Какой стандарт script Я бы сделал это, Init.ps1, Install.ps1 или где-то еще?

Ответ 1

Вот PowerShell script, который создаст папку решений под названием "Родитель" и другую папку решений под названием "Ребенок" внутри нее. Он также добавляет файл проекта (MyProject.csproj) в папку "Решение для ребенка".

# Get the open solution.
$solution = Get-Interface $dte.Solution ([EnvDTE80.Solution2])

# Create the parent solution folder.
$parentProject = $solution.AddSolutionFolder("Parent")

# Create a child solution folder.
$parentSolutionFolder = Get-Interface $parentProject.Object ([EnvDTE80.SolutionFolder])
$childProject = $parentSolutionFolder.AddSolutionFolder("Child")

# Add a file to the child solution folder.
$childSolutionFolder = Get-Interface $childProject.Object ([EnvDTE80.SolutionFolder])
$fileName = "D:\projects\MyProject\MyProject.csproj"
$projectFile = $childSolutionFolder.AddFromFile($fileName)

Здесь используются два основных интерфейса Visual Studio: Solution2 и SolutionFolder. Он также использует функцию Get-Interface, предоставляемую NuGet.

Для пакета, предназначенного только для решения, вы должны поместить свой script в init.ps1, потому что install.ps1 используется только для проектов пакеты. Init.ps1 запускается один раз для решения, когда пакет впервые установлен, и каждый раз, когда решение повторно открывается в Visual Studio.

Чтобы добавить произвольные файлы (файлы без проекта) в папку решений, вам нужно будет сделать что-то похожее на следующее:

$vsSolution = Get-Interface $dte.Solution ([EnvDTE80.Solution2])
$vsProject = $vsSolution.AddSolutionFolder("newFolder")
$projectItems = Get-Interface $vsProject.ProjectItems ([EnvDTE.ProjectItems])
$projectItems.AddFromFile("pathToFileToAdd.txt")

То, что отсутствует в этом PowerShell script, - это стандартные объявления параметров в верхней части файла.

param($installPath, $toolsPath, $package, $project)

То, что также отсутствует, - проверка того, существует ли папка решения и элемент папки. Я оставлю это как упражнение для вас.