2016-09-27 2 views
1

Использования MSBuild включает решение>Как получить значение свойства файла проекта с помощью MSBuild

<ItemGroup> 
    <ProjectToBuild Include="$(SVNLocalPath)\$(SolutionName)"> </ProjectToBuild> 
</ItemGroup> 

мне нужно, чтобы включить все * .csproj файл из раствора с условием файла PROJ содержать или определить свойство; например, если 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> 

Благодарности

+0

Итак, если я правильно понимаю, у вас на самом деле есть 2 вопроса: а) как получить все проекты из решения и b) отфильтровать их на каком-то свойстве? Вы считали «вручную» grepping файла для этих указателей? – stijn

ответ

2

Вы можете достичь этого с помощью пользовательской задачи.

Простой пример, чтобы проверить свойство (тест) во всех проектах исключить текущий проект текущего решения:

<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> 

Больше информации, пожалуйста, обратитесь к this статье.

+0

Отлично, большое спасибо –

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