Получить $ (SolutionDir) во время выполнения - PullRequest
1 голос
/ 05 сентября 2011

Мне удалось получить переменную $ (SolutionDir) во время выполнения, используя эту задачу:

<Target Name="GenerateCode" Outputs="$(IntermediateOutputPath)ResourcesPath-Constants.cs">
  <Exec Command=
        "
        echo namespace SRE.Widgets.Blend &gt; $(IntermediateOutputPath)ResourcesPath-Constants.cs
        echo { &gt;&gt; $(IntermediateOutputPath)ResourcesPath-Constants.cs
        echo     public static partial class ResourcesPath &gt;&gt; $(IntermediateOutputPath)ResourcesPath-Constants.cs
        echo     { &gt;&gt; $(IntermediateOutputPath)ResourcesPath-Constants.cs
        echo         public static string SOLUTION_DIR = @&quot;$(SolutionDir)&quot;; &gt;&gt; $(IntermediateOutputPath)ResourcesPath-Constants.cs
        echo     } &gt;&gt; $(IntermediateOutputPath)ResourcesPath-Constants.cs
        echo } &gt;&gt; $(IntermediateOutputPath)ResourcesPath-Constants.cs
        " />
</Target>
<Target Name="CompileGeneratedCode">
  <ItemGroup>
    <Compile Include="$(IntermediateOutputPath)ResourcesPath-Constants.cs" />
  </ItemGroup>
</Target>
<PropertyGroup>
  <CompileDependsOn>
    GenerateCode;
    CompileGeneratedCode;
    $(CompileDependsOn);
  </CompileDependsOn>
</PropertyGroup>

У меня проблема в том, что, поскольку у задачи нет «Входов», этот проект всегда создается. Это странно, потому что это нарушает пошаговую компиляцию. Этот проект используется в различных решениях, и я хочу, чтобы он компилировался только при изменении решения.

Я пытался использовать Inputs = "$ (SolutionPath). Это хорошо работает, если вы используете только одно решение, но когда вы используете проект из другого решения, sln.cache повреждается и останавливает построение задачи навсегда. Неважно если вы удалите переменную Inputs. Единственный способ заставить ее работать снова - это удалить файл .sln.cache.

Кто-нибудь знает способ остановить сборку проекта каждый раз?

EDIT:

Ok. Я нашел решение:

<Target Name="GenerateTmpCode">
  <Exec
    Command=
        "
        echo namespace SRE.Widgets.Blend &gt; $(IntermediateOutputPath)ResourcesPath-Constants.g.cs.tmp
        echo { &gt;&gt; $(IntermediateOutputPath)ResourcesPath-Constants.g.cs.tmp
        echo     public static partial class ResourcesPath &gt;&gt; $(IntermediateOutputPath)ResourcesPath-Constants.g.cs.tmp
        echo     { &gt;&gt; $(IntermediateOutputPath)ResourcesPath-Constants.g.cs.tmp
        echo         public static string SOLUTION_DIR = @&quot;$(SolutionDir)&quot;; &gt;&gt; $(IntermediateOutputPath)ResourcesPath-Constants.g.cs.tmp
        echo     } &gt;&gt; $(IntermediateOutputPath)ResourcesPath-Constants.g.cs.tmp
        echo } &gt;&gt; $(IntermediateOutputPath)ResourcesPath-Constants.g.cs.tmp
        fc $(IntermediateOutputPath)ResourcesPath-Constants.g.cs.tmp $(IntermediateOutputPath)ResourcesPath-Constants.g.cs
        "
    ContinueOnError="true">
    <Output PropertyName="CommandExitCode" TaskParameter="ExitCode"/>
  </Exec>
</Target>

<Target Name="GenerateCode"
        Condition="'$(CommandExitCode)'!='0'"
        Outputs="$(IntermediateOutputPath)ResourcesPath-Constants.cs"
        Inputs="$(IntermediateOutputPath)ResourcesPath-Constants.g.cs.tmp" >
  <Exec Command=
        "
        copy $(IntermediateOutputPath)ResourcesPath-Constants.g.cs.tmp $(IntermediateOutputPath)ResourcesPath-Constants.g.cs
        " />
</Target>

<Target Name="CompileGeneratedCode">
  <ItemGroup>
    <Compile Include="$(IntermediateOutputPath)ResourcesPath-Constants.g.cs">
      <AutoGen>True</AutoGen>
    </Compile>
  </ItemGroup>
</Target>

<PropertyGroup>
  <CompileDependsOn>
    GenerateTmpCode;
    GenerateCode;
    CompileGeneratedCode;
    $(CompileDependsOn);
  </CompileDependsOn>
</PropertyGroup>

Есть две цели. Первый создает частичный класс, содержащий строку со значением $ (solutiondir) во временном файле, и сравнивает его с текущим используемым частичным классом. Второй копирует временный файл поверх текущего, если это необходимо.

...