NuGet: Возможность добавления строки кода через Powershell?

У меня есть несколько пакетов NuGet, которые я собрал, один из которых является общим проектом, на который ссылаются все остальные.

Этот общий проект вставляет класс конфигурации в App_Start папка, и метод этого класса затем вызывается WebActivator.

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

Я знаю, что могу очень просто добавить дополнительный класс, который содержит только одну строку кода, но я бы предпочел, если возможно, использовать Install.ps1 Скрипт powershell для добавления строки кода в существующий класс конфигурации.

Использование обработанного файла *.cs.pp перезапишет существующий файл (или добавит новый), и *.cs.transform не будет работать с таким файлом.

Я знаю, где находится класс и как он называется, и я знаю, как вызывается метод, поэтому предлагает ли Powershell средство добавления строки в конец указанного метода?

1 ответ

Решение

Это возможно, но не тривиально. Вы также должны быть очень осторожны, так как удаление чьего-либо кода из пакета NuGet не сделает их очень счастливыми.

При установке пакета NuGet у вас есть доступ к объектной модели Visual Studio (EnvDTE). Переменная $project может использоваться для доступа к нужному элементу проекта. Из этого вы можете использовать FileCodeModel, который представляет код в файле. Затем вам нужно будет найти класс и его метод. Затем создайте точку редактирования и вставьте текст.

Следующее найдет класс с именем Class1 и вставит строку кода в его метод Foo. Обратите внимание, что вставленная строка кода не будет иметь правильного отступа, вам нужно будет это выяснить, посмотрев на документ.

$project.ProjectItems.Item("Class1.cs")
$namespace = $item.FileCodeModel.CodeElements | ? {$_.Kind -eq 5}
$namespace.Members.Item("Class1")
$method = $class.Members.Item("Foo")
$endPoint = $method.GetEndpoint([EnvDTE.vsCMPart]::vsCMPartBody)
$editPoint = $endpoint.CreateEditPoint()
$editPoint.Insert("int a = 0;")

Также вышеприведенный код не обрабатывает ошибки.

Другие вопросы по тегам