2015-05-07 49 views
0

我有一個項目,有一個特定的非標準文本格式的文件。當這些文件被觸摸/修改時,我想運行一個特定的自定義編譯器來生成XML,這是整個解決方案輸出的一部分。如何將MSBuild自定義任務合併到Visual Studio解決方案中?

我正在考慮創建一個MSBuild任務來執行此操作。它將輸入非標準文件名稱並輸出必需的XML文件。該任務將在解決方案的其他項目中使用。

我希望此項目的新開發人員擁有最少的設置。這意味着,我希望能夠直接從源代碼控制中獲取我的解決方案的完整副本,並讓構建首先構建自定義任務,然後根據需要將其應用於班級中的其他項目。

我擔心構建自定義任務的項目的構建輸出需要將其輸出組件複製到某個已知位置,以便其他項目可以引用它。做這件事的正確方法是什麼?

+0

不要過度設計。將預先構建的MyCustomTask.dll簽入到源代碼控制中,然後從您的項目中引用它,例如:' –

+0

作爲ST說:把大會放在一個「知名」的位置,並從那裏引用它。如果你真的想讓你不必將預先構建的任務dll放到源代碼控制中,但是可以使用'Csc'任務從源代碼構建它。 – stijn

回答

0

因爲Visual Studio在第一次使用時會進入lock the custom task Assembly,從而導致Visual Studio中的任何進一步構建(即構建>解決方案)失敗,因此您即將陷入混亂。

正如@stijn所評論的,您應該重寫構建目標並使用另一種構建具有自定義任務的程序集的方法,例如,使用Csc任務或產生另一個MSBuild.exe進程(請參閱對鏈接問題的回答)。

我決定去的方式是創建一個單獨的解決方案,例如, 「構建工具」,包含自定義任務程序集(以及其他工具),並要求在其他任何工具之前構建它。我個人發現這個來源的預先編譯的二進制文件非常難以接受。如果開發人員不想構建構建工具解決方案,他們會複製一些夜間構建的輸出。

不幸的是,沒有一種簡單的方式來避開已知(相對)位置的「硬編碼」。使用$(SolutionDir)通常是可行的 - 如果你試圖直接在項目上運行MSBuild,而不是解決方案(當你自己打開一個項目時VS更聰明)。

相關問題