2015-03-11 3 views
2

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

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

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

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

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

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

ответ

2

Это возможно, но не тривиально. Вы также должны быть очень осторожны, поскольку удаление чей-то кода из пакета 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;") 

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

+1

Код, который вы указали, не был идеальным, но это был 90% пути. Начав с «Get-Project» в консоли управления пакетами NuGet, я смог пройти каждый шаг, посмотреть, что возвращается, и использовать документацию по указанной ссылке. Я выяснил, что нужно. Большое спасибо. – awj

Смежные вопросы