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;")
Также вышеприведенный код не обрабатывает ошибки.