如何使用msbuild获取项目文件的属性值

3
使用MSBuild,我包含了一个解决方案。
<ItemGroup>
    <ProjectToBuild Include="$(SVNLocalPath)\$(SolutionName)"> </ProjectToBuild>
</ItemGroup>

我需要将解决方案中所有带有条件的*.csproj文件包含在内,例如如果x.csproj包含已定义的属性“TestProjectType”,则会将该项目包含在我的itemGroup中。
类似于以下内容:
<Target Name = "TestProperties">
    <Message Text="TestProperties"/>
    <ItemGroup>
        <AllProj Include="$(SVNLocalPath)\*.csproj"/>
        <AllTestProj Include="%(AllProj.Identity)" Condition="%(AllProj.ProjectTypeGuids)=={3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"/>
    </ItemGroup>
    <Message Text="@(AllTestProj )"/>
</Target>

Thanks


如果我理解正确,您实际上有两个问题:a)如何从解决方案中获取所有项目,b)如何根据某些属性过滤这些项目?您考虑过手动在文件中搜索这些GUID吗? - stijn
1个回答

3
通过自定义任务,您可以实现这一目标。
以下是在当前解决方案的所有项目中检查一个属性(test),但排除当前项目的简单示例:
<UsingTask TaskName="GetPropertyTask" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v12.0.dll">
    <ParameterGroup>
      <ProjectFile ParameterType="System.String" Required="true" />  
      <BuildOutput ParameterType="System.String[]" Output="true" />
    </ParameterGroup>
    <Task>
      <Reference Include="System.Xml"/>
      <Reference Include="Microsoft.Build"/>
      <Using Namespace="Microsoft.Build" />
      <Using Namespace="Microsoft.Build.Evaluation" />
      <Using Namespace="Microsoft.Build.Utilities" />
      <Code Type="Fragment" Language="cs">
          <![CDATA[

        var properties = new Dictionary<string, string>
        {
          { "Configuration", "$(Configuration)" },
          { "Platform", "$(Platform)" }
        };
        //Log.LogMessage(MessageImportance.High, "customLog");
        // Log.LogMessage(MessageImportance.High, ProjectFile);

        var collection = new ProjectCollection(properties);
        var project = collection.LoadProject(ProjectFile);
       ProjectProperty pp = project.Properties.Where(p => p.Name == "MyCustomProperty").FirstOrDefault();
            string customValue = pp==null?"empty":pp.EvaluatedValue;
       BuildOutput = new String[] { customValue };
      ]]></Code>
    </Task>
  </UsingTask>
  <Target Name="AfterBuild">
    <GetPropertyTask ProjectFile="%(ProjectToScan.FullPath)">
      <Output ItemName="ProjectToScanOutput" TaskParameter="BuildOutput"/>
    </GetPropertyTask>
    <Message Text="ClassLibrary1" Importance="high"  Condition="'%(ProjectToScanOutput.Identity)' == 'test'" />
  </Target>

更多信息,请参见文章。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接