2014-01-08 120 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)。你能解释一下如何自动将这个导入添加到“默认”所有项目中? –

相关问题