在构建之前强制文件重新加载

时间:2010-03-30 04:26:49

标签: visual-studio visual-studio-2010

我们有一个工具可以生成一些用于构建项目的代码(.cs)文件。

编辑:这些文件是某些部分类的另一半,因此构建过程需要访问源。例如,它无法将其编译为DLL,然后设置构建顺序。

该工具在预构建步骤中运行,但只有在构建之后才在解决方案中更新文件,这意味着需要执行两次构建以在更改输入后清除错误。

示例:

  • 修改工具输入文件
  • 运行构建
    • 工具运行并更改源文件
  • 构建失败
  • 运行构建
    • 工具运行并更改源文件(但实际上并没有更改,因为输入保持不变)
  • 构建成功

我们如何能够取消双重构建,仍然让我们的工具从VS运行?

谢谢你们!

4 个答案:

答案 0 :(得分:3)

编写一个VS宏来执行你的工具,然后启动一个构建,这样你就可以用一个按键执行整个过程,以更快的方式进行双重构建。

或者(或与上述相结合),您可以将自定义工具添加到执行工具的VS工具菜单中(请参阅工具 - >外部工具)。然后在执行构建之前手动执行此自定义工具 - 这仍然是一个繁琐的双重步骤,但比构建两次更快更容易。 (并且您可能能够在预构建步骤中保持工具运行,因此旧的双构建方法仍然有效。)

另一个选项可能是编辑项目的MSBuild脚本,以便在构建过程的早期执行您的工具,以便在依赖项扫描期间获取对文件的更改(因此只需要一个构建过程)。 p>

这些都不是很好的解决方案,但希望它们可以为您提供一个能够为您目前的情况提供可接受的改进的领导。

答案 1 :(得分:1)

将你的soln重构为2个项目:第一代是cs文件,第二代使用它(作为dll)。

第一个项目(称之为Gen)有2个构建后事件:1个运行工具并重新创建源文件,2)编译Gen'ed src文件供第二个项目使用:

Gen.exe 
csc.exe /target:library Gened.cs

第二个项目(称为Use)引用dll并调用它。

== Gen.cs

using System.IO;
namespace sm3
{class Gen
{static string bod = "public static int var = 46;";
 static string clas = "public class Gened {" + bod + "}";
 static string ns  = "namespace sm3 {" + clas + "}";
 static void Main(string[] args)
 {StreamWriter SW;
     SW = File.CreateText("Gened.cs");
     SW.WriteLine(ns);
     SW.Close();
    }}}

== Use.cs

using System;
namespace sm3
{class Use
    {static void Main(string[] args)
        {Gened g = new Gened();
         Console.Write(Gened.var.ToString());
         Console.ReadLine();
         }}}

答案 2 :(得分:0)

答案结果是“使用Cake”和Powershell

答案 3 :(得分:0)

如果有人在寻找这个。使用csproj,您无法使用BeforeTargets="PrepareForBuild"条件:

<Target Name="PrecompileScript" BeforeTargets="PrepareForBuild">
    <Exec Command="tool.exe" />
</Target>

PrepareForBuild 目标将在加载要编译的文件之前执行。有关预定义的构建目标的更多详细信息,请参见MSBuild Targets