2016-02-25 56 views
1

我有一個C++項目,我需要在某些頭文件上運行自定義生成工具以生成編譯此項目時所需的代碼。一般來說,我的配置工作。我觸發一個構建,VS/MSBuild檢測輸出文件是否是最新的,並且只在必要時運行定製構建工具。MSBuild運行不同配置時不必要地運行custombuild工具

但是,如果構建與同一項目的另一個配置結合運行,則會出現問題。這兩種配置都取決於自定義構建工具的輸出文件。因此,如果按順序運行,只有一個配置應該觸發自定義構建工具運行。對於哪個配置,構建會被觸發,其次是自定義構建工具的輸出文件已經存在並且是最新的。所以不需要重新構建它們。不幸的是,這正是發生的事情。由於自定義構建工具需要相當長的時間才能運行,因此這會大大增加構建時間。 另一個有趣的方面是,一旦兩個配置都運行,我可以再次觸發它們中的任何一個,並且不調用自定義構建工具。

我會從documentation預期的是,自定義生成工具觸發:

  • 如果任何指定爲輸出的文件如果文件我指定了缺少
  • 定製構建工具被修改晚於指定爲的任何現有文件輸出
  • 如果我指定爲的任何文件其他依賴項進行了修改,不遲於指定爲輸出

但所有這些獨立爲其構建觸發的配置現有的任何文件。

有沒有人有一個想法,爲什麼會發生這種情況?我檢查了兩種配置的自定義構建工具的設置是相同的。輸出文件生成到兩個配置的相同文件夾中。

+0

使其重現性很容易,然後通過Microsoft Connect或MSBuild GitHub回購報告給Microsoft。 –

+1

VS用來追蹤哪些文件是最新的,哪些不是默認進入每個配置目錄,所以儘管它們實際上位於相同的目錄中,但就輸入文件而言VS也是不同的。見[相關](http://stackoverflow.com/questions/35107313/how-does-visual-studio-know-my-project-is-up-to-date-so-it-can-skip-running-msbu /)問題/答案。你不會說什麼應該觸發自定義生成。如果您將問題添加到問題以及最小樣本中,也許有人可以提出解決方法。 – stijn

+0

你是說文檔(https://msdn.microsoft.com/en-us/library/hefydhhy.aspx)是錯誤的?我會根據請求更新我的問題... – sigy

回答

1

您提到的文檔基本上是正確的,但它忽略了基本上每個項目配置/平臺的所有內容,因爲它使用tracker.exe,它依賴於默認進入中間目錄的.tlog文件。因此,正如你所想的那樣,使所有配置使用tlog文件的相同位置應該使跟蹤器保持高興,並且只在需要時調用定製構建工具,而不依賴於配置/平臺。我不確定我會推薦這些,但共享臨時目標文件可能會在稍後導致問題。

解決此問題的另一種方法是添加一個單獨的項目,只有一個配置,說'自定義',並在那裏做自定義生成。而不是讓當前項目依賴於該項目,並在解決方案的配置管理器中調整所有條目,以便現在爲每個配置構建新項目的「自定義」配置。

+0

在我的情況下,應該「重用」其他配置的自定義構建工具的結果的配置不會產生任何臨時對象文件。因此我認爲這是合理的保存,因爲除* .tlog以外不會共享任何文件。然而,你對這個話題的評論是正確的。 – sigy