代码之家  ›  专栏  ›  技术社区  ›  Byron Ross

在生成之前强制重新加载文件

  •  4
  • Byron Ross  · 技术社区  · 14 年前

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

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

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

    例子:

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

    有什么想法可以让我们摆脱双重构建,同时让我们的工具从vs运行?

    谢谢大家!

    3 回复  |  直到 8 年前
        1
  •  3
  •   Jason Williams    14 年前

    编写一个执行工具的vs宏,然后启动一个构建,这样就可以用一个键按来执行整个过程,速度比执行两次构建要快。

    或者(或者结合以上内容),可以将自定义工具添加到执行工具的vs tool菜单(请参见工具->外部工具)。然后在执行构建之前手动执行这个自定义工具-这仍然是一个冗长的两步,但是比构建两次要快得多,也容易得多。(而且您可能可以让您的工具在预构建步骤中运行,这样旧的双构建方法仍然可以工作)。

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

    这些都不是很好的解决方案,但希望它们能给你一个领先优势,为你目前的状况提供一个可以接受的改善。

        2
  •  1
  •   ja.    14 年前

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

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

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

    第二个项目(调用它use)引用dll并调用它。

    = G.C.

    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();
        }}}
    

    = U.E.CS

    using System;
    namespace sm3
    {class Use
        {static void Main(string[] args)
            {Gened g = new Gened();
             Console.Write(Gened.var.ToString());
             Console.ReadLine();
             }}}
    
        3
  •  0
  •   Byron Ross    8 年前

    答案是“使用 Cake “和powershell