MSBuild似乎仅将旧输出文件用于自定义构建工具

时间:2010-04-05 16:48:12

标签: msbuild

我有一个ANTLR语法文件作为C#项目文件的一部分,并遵循User Manual中列出的步骤。

<Project ...>
    <PropertyGroup>
        <Antlr3ToolPath>$(ProjectDir)tools\antlr-3.1.3\lib</Antlr3ToolPath>
        <AntlrCleanupPath>$(ProjectDir)AntlrCleanup\$(OutputPath)</AntlrCleanupPath>
    </PropertyGroup>
    <ItemGroup>
        <Antlr3 Include="Grammar\Foo.g">
            <OutputFiles>FooLexer.cs;FooParser.cs</OutputFiles>
        </Antlr3>
        <Antlr3 Include="Grammar\Bar.g">
            <OutputFiles>BarLexer.cs;BarParser.cs</OutputFiles>
        </Antlr3>
    </ItemGroup>
    <Target Name="GenerateAntlrCode"
            Inputs="@(Antlr3)"
            Outputs="%(Antlr3.OutputFiles)">
        <Exec Command="java -cp %22$(Antlr3ToolPath)\antlr-3.1.3.jar%22 org.antlr.Tool -message-format vs2005 @(Antlr3Input)" Outputs="%(Antlr3Input.OutputFiles)" />
        <Exec Command="%22$(AntlrCleanupPath)\AntlrCleanup.exe%22 @(Antlr3Input) %(Antlr3Input.OutputFiles)" />
    </Target>
    <ItemGroup>
         <!-- ...other files here... -->
         <Compile Include="Grammar\FooLexer.cs">
             <AutoGen>True</AutoGen>
             <DesignTime>True</DesignTime>
             <DependentUpon>Foo.g</DependentUpon>
          </Compile>
          <Compile Include="Grammar\FooParser.cs">
              <AutoGen>True</AutoGen>
              <DesignTime>True</DesignTime>
              <DependentUpon>Foo.g</DependentUpon>
          </Compile>
          <!-- ... -->
    </ItemGroup>
</Project>

无论出于何种原因,Compile步骤仅使用旧版本的代码,似乎没有任何调整可以提供帮助。

“旧版本”,我的意思是如果我清理解决方案,构建项目,Foo.gFooLexer.csFooParser.cs。我是否应该对Foo.g进行更新并重新编译,将忽略词法分析器和解析器C#文件的新版本并使用旧版本。我必须第二次编译......

1 个答案:

答案 0 :(得分:1)

IDE中似乎存在一个错误:Visual Studio仅监视其自身修改的C#文件中的更改(例如,设计器生成的代码)。对于在IDE外部修改/生成的代码(例如ANTLR等外部工具),它将使用文件的内存版本,而不从磁盘刷新。

解决方法是不使用“托管”缓存,而是生成外部CSC进程来编译项目。您可以通过在.csproj中将“UseHostCompilerIfAvailable”项目属性设置为false来执行此操作:

<UseHostCompilerIfAvailable>FALSE</UseHostCompilerIfAvailable>

有关详细信息,请参阅this entry in the MS Connect website

我在Visual Studio中遇到与ANTLR完全相同的问题,这对我来说已经解决了。但是,有些人在将该选项设置为“false”后报告了项目到项目依赖性的问题,因此请注意副作用...