【问题标题】:Force File Reload Before Build在构建之前强制文件重新加载
【发布时间】:2010-03-30 04:26:49
【问题描述】:

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

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

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

例子:

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

有什么想法可以取消双重构建,并且仍然让我们的工具在 VS 中运行?

谢谢大家!

【问题讨论】:

  • 我也遇到了同样的问题,但是我们的工具没有经常做出改变,以至于我试图修复它:)
  • 我也遇到了同样的问题。我将我的预构建事件移动到构建顺序中较早的项目的构建后事件并且它起作用了。

标签: visual-studio visual-studio-2010


【解决方案1】:

编写一个执行您的工具然后开始构建的 VS 宏将是微不足道的,这样您就可以通过一个按键来执行整个过程,以更快的方式进行双重构建。

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

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

这些都不是很好的解决方案,但希望它们可以为您提供领先优势,从而在您当前的情况下提供可接受的改进。

【讨论】:

    【解决方案2】:

    将您的解决方案重构为 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();
        }}}
    

    ==使用.cs

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

    【讨论】:

    • 我们不能这样做,因为生成的代码是部分类的一部分。
    【解决方案3】:

    答案竟然是“使用Cake”和Powershell

    【讨论】:

      【解决方案4】:

      如果有人正在寻找这个。使用 csproj 你不能使用BeforeTargets="PrepareForBuild" 条件:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-02
        • 2018-03-19
        • 1970-01-01
        • 2011-07-02
        • 2015-02-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多