2010-03-30 88 views
4

我們有一個生成一些代碼(的.cs),用於建設該項目文件的工具。強制文件刷新之前建立

編輯:這些文件都是一些局部類的另一半,所以在生成過程需要訪問源。例如,無法將其編譯到DLL中,然後設置構建順序。

該工具在預生成步驟運行,但是文件僅在生成後的溶液,這意味着構建需要進行兩次改變到輸入後清除錯誤更新。

例子:

  • 修改工具輸入文件
  • 運行構建
    • 工具運行並更改源文件
  • 構建失敗
  • 運行構建
    • 工具運行和變化的源文件(但它不實際上改變,因爲輸入保持不變)
  • 生成成功

任何想法,我們如何能與雙構建做了,而且還讓我們的工具從VS運行?

謝謝你們!

+1

我有同樣的問題,太多,但我們的工具不會更改往往足以讓我試圖修復它:) – 2010-03-30 04:30:19

+0

我也有同樣的問題。我將我的預生成事件移到構建順序的早期項目的構建後事件中,並且工作正常。 – AndrewS 2013-10-17 01:03:50

回答

0

的答案竟然是「使用Cake」和PowerShell

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

我們不能這樣做,因爲生成的代碼是分部類的一部分。 – 2010-03-30 23:37:57

3

這將是微不足道寫一個VS宏,將執行你的工具,然後開始構建,所以你能整個過程只需一次按鍵即可完成,而且可以快速完成雙重構建。

或者(或與上述相結合),你可以自定義的工具來執行您的工具(見工具 - >外部工具)的VS工具菜單中添加。然後在執行構建之前手動執行此自定義工具 - 這仍然是一個乏味的雙重步驟,但比構建兩次更快更簡單。 (並且您可能會讓您的工具在預構建步驟中運行,因此舊的雙重構建方法仍然可以運行)。

另一個選項可能是編輯您的項目的MSBuild腳本,以便在構建過程的早期執行您的工具,以便在依賴性掃描期間獲取對該文件的更改(因此只需要一個構建過程)。

這些都不是很好的解決方案,但希望它們能夠爲您提供一個可以接受的改進方案,並且可以幫助您改善目前的狀況。