2014-01-08 193 views
5

在Visual Studio 2010到2013中,默認情況下(例如,當我創建新的控制檯應用程序時),新解決方案將其編譯的可執行文件輸出到Solution name/Project name/bin/Debug/。我希望它們輸出到Solution name/Debug/,同樣適用於所有其他構建配置,如「發佈」。如何更改Visual Studio中的默認生成輸出目錄?

我可以通過手動進入每個項目的性質,去Build選項卡,從bin\Debug改變Output path..\Debug做到這一點。我必須爲每個項目和每個構建配置重複這一點。

經過幾十個解決方案之後,我每次都手工完成這項繁瑣的任務,我有點不舒服。有沒有辦法改變默認輸出路徑?

適用於Visual Studio 2013的解決方案已足夠。

回答

7

此屬性是每個Visual Studio Project Template

因此,舉例來說,在C#控制檯應用程序模板位於

\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\ProjectTemplates\CSharp\Windows\1033\ConsoleApplication\consoleapplication.csproj 

的的csproj定義是,你可以在你的意志編輯XML文件。構建輸出目錄是這樣定義(每個配置):

... 
<OutputPath>bin\Debug\</OutputPath> 
... 
<OutputPath>bin\Release\</OutputPath> 
... 

如果你修改了這個文件,它會改變您未來所有新的C#控制檯應用程序項目。您也可以編寫一個實用程序,列出\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\ProjectTemplates中的所有csproj並相應地更新它們。

+0

謝謝,我認爲這是我正在尋找 - 我會試着看看它今天晚些時候是否有效(抱歉這麼久)。 – Superbest

+2

你真的不應該修改全局受保護的文件。事實上,這可能會中斷服務,如果模板得到更新以修復錯誤或新功能,修改後的文件將不會更新。相反,您可以在自己的.csproj中設置'',它會覆蓋全局設置(如果先導入)。這是MSBuild項目中的建議。 – Heath

+0

我解決了我的問題,通過創建一個新的模板,輸出目錄如您所述設置,謝謝! – Superbest

3

這不是必需的。

您的解決方案中的一個項目被標記爲啓動項目,在解決方案資源管理器窗口中以粗體顯示。一個EXE項目,就像你的控制檯模式應用程序。您使用Project + Add Reference來添加對解決方案中其他項目的引用,以便您可以使用這些項目在您的控制檯模式應用程序中生成的類庫。

這些引用將複製本地屬性設置爲True。

當你建立你的項目時,MSBuild將自動將組件從各自的bin \ Debug目錄複製到控制檯模式應用程序的bin \ Debug目錄中,這要歸功於該複製本地設置。而且它足夠聰明,可以查看這些類庫的依賴關係,並複製它們。

因此,構建完成後,bin \ Debug目錄不會只有您的控制檯模式項目的EXE文件,但它需要正確執行的所有DLL。

有幾種方法可能會出錯,MSBuild無法弄清楚這種依賴關係實際存在。非常罕見,例如,您必須在代碼中使用Reflection來加載程序集(Assembly.Load()和朋友)。解決方法是在生成後事件中顯式複製依賴項。你沒有在你的問題中留下足夠的麪包屑來判斷這是否是真正的問題。

你所要求的肯定是可能的,IDE並不容易,因爲它並不是設計成假定這是必要的。您必須將生成+輸出路徑設置替換爲..\Debug。您可以使用已經預設的設置創建您自己的項目模板。創建一個新的類庫項目,更改設置並使用文件+導出模板創建模板。您下次創建項目時可以使用它。

但是,真的,首先找出爲什麼默認的複製本地機器不適合你。

+0

將解決方案的所有項目輸出到1個文件夾中是有意義的,因爲它們只存在於一個輸出文件夾中,所以它節省了一些時間和空間(考慮SSD)複製內部解決方案依賴項。 – Firo

+0

這不僅僅是方式MSBuild的設計。你可以打造構建系統,但效率不高。不,你沒有節省時間。複製構建輸出文件是一種簡單的從內存到內存的複製,它在現代機器上以超過10 GB /秒的速度運行。花費半毫秒,你永遠不會注意到它。所有人都歡呼文件系統緩存。如果你想這樣做,那麼MSBuild不會阻止你,只是麻煩你。 –

+0

我想我說我的問題是這樣的,它預先假定它實際上是必要的。要清楚,我現在想要這樣做的原因(我將來可能還有其他原因)是我喜歡將輸入文件提供給程序並將輸出生成到文件中,這意味着我經常在調試時訪問這些文件並發展。我想你會建議我將這些文件添加到我的項目中,從Visual Studio中編輯它們,並允許它們在構建期間被複制 - 聽起來像是一個好主意,儘管我不得不考慮它是否會解決每一個問題我都有。 – Superbest

1

您可以創建自己的.targets文件來改變<OutputPath>,而不需要更改全局受保護的文件,並將其導入到項目中。這也可以設置其他默認值,您可能想要更改並且不想爲每個項目執行此操作。所有你需要做的,然後在你的項目文件是添加類似的頂部(在根元素,當然):

<Import Project="$(SolutionDir)\Common.targets"/> 
+0

這並沒有真正回答我相信的問題,但您仍然需要手動操作(甚至不使用IDE)。你能解釋一下如何自動將這個導入添加到「默認」所有項目中? –

相關問題