4

我一直在尝试编写一个 MSBuild 任务来将 CoCo/R .ATG 文件“编译”成 C# 文件,然后将其编译成可执行文件,这是为了替换预构建事件。
我已经设法让 .ATG -> .cs 进程正常工作,但是由于生成的 .cs 文件没有被编译,所以有些不对劲。
如果我再次修改 .ATG 文件,“旧”.cs 文件似乎会被编译,然后生成新文件。
我很确定我遗漏了一些东西,这些东西会通知构建过程的其余部分这些文件已更改。

这是我在 Visual Studio 2010 项目中包含的目标定义。

<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <ItemGroup>
    <AvailableItemName Include="BuildATG" />
  </ItemGroup>

  <PropertyGroup>
    <CoreBuildDependsOn>
      BuildATGTarget;
      $(CoreBuildDependsOn)
    </CoreBuildDependsOn>
  </PropertyGroup>

  <Target Name="BuildATGTarget" Inputs="@(BuildATG)" Outputs="@(BuildATG -> '%(RelativeDir)Parser.cs')">
    <Exec Command="Coco.exe %(BuildATG.Identity)" Outputs="%(BuildATG.RelativeDir)Parser.cs" />
  </Target>

</Project>

我对 MSBuild 完全陌生,所以任何建议/指针都将不胜感激。

4

1 回答 1

1

我发现的一种可能的解决方案是进行以下更改并在目标内添加一个 ItemGroup。

<Target Name="BuildATGTarget" Inputs="@(BuildATG)" Outputs="@(BuildATG -> '%(RelativeDir)Parser.cs')">
  <Exec Command="Coco.exe %(BuildATG.Identity)" Outputs="%(BuildATG.RelativeDir)Parser.cs" />
  <ItemGroup>
    <Compile Include="%(BuildATG.RelativeDir)Parser.cs" />
    <Compile Include="%(BuildATG.RelativeDir)Scanner.cs" />
  </ItemGroup>
</Target>

为避免构建中出现重复文件,您还需要在 Visual Studio 2010 项目中使用Build Action: None标记文件(Parser.cs 和 Scanner.cs)

于 2012-09-22T07:39:21.517 回答