2015-04-15 6 views
2

У меня есть пользовательская цель MSBuild, частичный фрагмент следующим образом ..Как повторно запустить оценку свойств в целевой среде MSBuild?

<Target Name="PublishHtm"> 
    <PropertyGroup> 
    <PublishHtmTemplateContents>$([System.IO.File]::ReadAllText($(PublishHtmTemplatePath)))</PublishHtmTemplateContents> 
    <PublishHtm>$(PublishHtmTemplateContents)</PublishHtm> 
    </PropertyGroup> 
    <WriteLinesToFile Lines="$(PublishHtm)" File="$(PublishDir)\publish.htm" Overwrite="true"/> 
</Target> 

Это попытка переделки для this solution в том, что я пытаюсь изолировать этот шаблон для внешнего файла. Шаблон содержит ссылки на свойства MSBuild, такие как $(ApplicationName). Выполняя это точно так, как описано в linked solution, он работает нормально, но при загрузке шаблона в виде строки ни одно из этих выражений свойств не оценивается к моменту, когда оно попадает в файл.

<SPAN CLASS="BannerTextApplication">$(ApplicationName)</SPAN> 

Есть выражение/функция MSBuild я могу использовать, чтобы получить строку перепроверены с учетом контекста, что цель в настоящее время вызывается?

BTW Я бы предпочел не работать вокруг проблемы с помощью find/replace или regex replace и придерживаться механизма выражения MSBuild.

Использование Visual Studio 2012 & .NET Framework 4.5.

+1

Вы должны поместить/пункт объявление свойства * внутри мишени *. См. Динамические свойства и элементы на странице https://msdn.microsoft.com/en-us/magazine/dd419659.aspx. –

+0

Вы загружаете этот шаблон из внешнего файла. Это означает, что движок msbuild не будет делать никакого расширения свойства в самом шаблоне. Таким образом, ваш $ (PublishHtmTemplateContents) - это просто текстовая строка, считанная из файла. И вы просто переписываете его в $ (PublishHtm) как текстовое значение. Двигатель не работает таким образом. Вы можете попытаться обернуть шаблон в какой-то форме цели в отдельный файл, а затем создать его с помощью задачи msbuild. –

+0

@SayedIbrahimHashimi, глядя на мой вопрос. Я читаю объявление своей собственности внутри целевого узла, и в вашей статье у меня есть TL, DR, поскольку в MSBuild есть TMI. Что вы получаете в? Можете ли вы обобщить разработку? –

ответ

2

Извините, что не возвращался к этому вопросу некоторое время. Первоначально я думал, что для решения этой проблемы нам нужно будет свести MSBuild очень необычным способом (сегодня планировалось написать сложную встроенную задачу, которая будет выполнять регулярное выражение во внешнем файле с использованием свойств Msbuild в качестве токенов). Но я думаю, что это можно решить проще, используя раздел CDATA, который действителен в определении свойства:

Вот главный сценарий:

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build"> 
    <PropertyGroup> 
     <MyOtherProperty>$([System.DateTime]::Now)</MyOtherProperty> 
     <Version>1.0.1b</Version> 
     <ProjectName>MSBuild Rox</ProjectName> 
     <Author>Alexey Shcherbak</Author> 
    </PropertyGroup> 

    <Target Name="Build"> 
     <ItemGroup> 
      <PropsToPass Include="MyOtherProperty=$(MyOtherProperty)" /> 
      <PropsToPass Include="Version=$(Version)" /> 
      <PropsToPass Include="ProjectName=$(ProjectName)" /> 
      <PropsToPass Include="Author=$(Author)" /> 
     </ItemGroup> 

     <MSBuild Projects="TransformHTML.Template.proj" Properties="@(PropsToPass)" /> 
    </Target> 
</Project> 

А вот ваш шаблон. Это не чистый html, это файл msbuild, но, по крайней мере, без уродливой кодировки для html-тегов в xml. Это просто блок в CDATA

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Transform"> 
    <PropertyGroup> 
      <HtmlProperty><![CDATA[ 
       <body> 
        <div>$(MyOtherProperty)</div> 
        <div>$(Version)</div> 
        <div>$(ProjectName)</div> 
        <div>$(Author)</div> 
       </body> 
      ]]></HtmlProperty> 
     </PropertyGroup> 

    <Target Name="Transform"> 
     <Message Text="HtmlProperty: $(HtmlProperty)" Importance="High" /> 
    </Target> 
</Project> 

Может быть, это не очень элегантно (я лично не нравится раздел с @PropsToPass), но это будет делать эту работу. Вы можете поместить все встроенные в один файл, а затем вам не нужно передавать свойства в задачу MSBuild. Мне не нравится массивный html-кодирование из предложенного «этого решения», но я предпочел бы сохранить HTML-шаблон в том же скрипте, где он будет преобразован, только в хорошем формате html, без кодирования.

Single Пример файла:

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build"> 
    <PropertyGroup> 
     <MyOtherProperty>$([System.DateTime]::Now)</MyOtherProperty> 
     <Version>1.0.1b</Version> 
     <ProjectName>MSBuild Rox</ProjectName> 
     <Author>Alexey Shcherbak</Author> 
    </PropertyGroup> 

    <Target Name="Build"> 
     <PropertyGroup> 
      <HtmlProperty><![CDATA[ 
       <body> 
        <div>$(MyOtherProperty)</div> 
        <div>$(Version)</div> 
        <div>$(ProjectName)</div> 
        <div>$(Author)</div> 
       </body> 
      ]]></HtmlProperty> 
     </PropertyGroup> 

     <Message Text="HtmlProperty: $(HtmlProperty)" Importance="High" /> 
    </Target> 
</Project> 

Вы можете также download these files here

+0

Пока это не напрямую ответьте на вопрос (видимо, это невозможно) переоценить внешние свойства MSBuild, как я просил), ваш ответ затрагивает мою непосредственную озабоченность по поводу наличия неуправляемого HTML в выходном сценарии MSBuild, поэтому спасибо. –

+0

Из моего понимания нет прямого способа переопределить тело сценария (включая свойство) в текущем контексте msbuild. Но, возможно, стоит проверить исходный код msbuild, чтобы подтвердить или опровергнуть это:) –

+0

К сожалению, как-то ваш предлагаемый подход не сохраняет свой контент в деталях. Например, точки с запятой теряются в CSS. Я все еще надеюсь, что то, что я ищу, все равно будет выполнимо, если я сгенерирую файл .targets и вызову '' или что-то еще. Еще нет. –