如何从powershell枚举csproj文件中的PropertyGroup元素

时间:2015-03-06 11:31:18

标签: powershell nuget envdte

我在powershell中编写了一个nuget安装脚本,我想访问项目文件的所有PropertyGroup元素(* .csproj)?

我可以访问一个名为$ project的变量来代表一个对象,我相信它是从EnvDTE实现Project接口 - 项目文件的抽象(* .csproj)。

如何从$ project对象获取PropertyGroup实例?

我希望nuget install powershell脚本的功能能够改变 包含此子元素的所有PropertyGroup元素的OutputPath。

2 个答案:

答案 0 :(得分:2)

PropertyGroup是.csproj文件的内部实现(MSBuild技术),而EnvDTE.Project是一个接口,因此使用EnvDTE.Project无法直接获取或修改 MSBuild元素,因为实际上在VS 2005之前,.csproj不是基于MSBuild的,并且EnvDTE.Project接口已经存在并且使用了以前的技术。

但作为一个界面,你当然可以完成任务:

OutputPath是每个项目配置的属性。您可以按照以下说明获取EnvDTE.Project的所有配置:

HOWTO: Get the projects configurations / platforms from a Visual Studio add-in

(加载项使用EnvDTE)

一旦有了EnvDTE.Configuration,就可以访问它的EnvDTE.Configuration.Properties集合,特别是“OutputPath”。参见:

HOWTO: Get the output build folder from a Visual Studio add-in or macro

更改完所有项目配置后,您可以调用EnvDTE.Project.SaveEnvDTE.Project.SaveAsEnvDTE.Project.FullName值作为参数传递。

答案 1 :(得分:0)

我找到了这个答案,这使我找到了解决方案:Transforming .csproj using nuget package

这是我在NuGet包中使用的脚本:

$msbuild = [Microsoft.Build.Evaluation.ProjectCollection]::GlobalProjectCollection.GetLoadedProjects($project.FullName) | Select-Object -First 1
($msbuild.Xml.PropertyGroups | Select-Object -First 1).AddProperty("TypeScriptCompileBlocked", "true")
$project.Save()