【问题标题】:How can I change the default build output directory in Visual Studio?如何更改 Visual Studio 中的默认构建输出目录?
【发布时间】:2014-01-27 05:25:53
【问题描述】:

在 Visual Studio 2010 到 2013 中,默认情况下(例如,当我创建新的控制台应用程序时)新解决方案会将其编译后的可执行文件输出到 Solution name/Project name/bin/Debug/。我希望将它们输出到Solution name/Debug/,同样适用于所有其他构建配置,例如“发布”。

我可以通过手动进入每个项目的属性,转到Build 选项卡,将Output pathbin\Debug 更改为..\Debug 来做到这一点。我必须为每个项目和每个构建配置重复此操作。

经过数十种解决方案,我有点厌倦了每次手动完成这项繁琐的任务。有没有办法改变默认输出路径?

适用于 Visual Studio 2013 的解决方案就足够了。

【问题讨论】:

    标签: visual-studio configuration build


    【解决方案1】:

    这个属性在每个Visual Studio Project Template中定义

    因此,例如,C# Console Application 模板位于

    \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 并相应地更新它们。

    【讨论】:

    • 谢谢,我想这就是我要找的东西 - 我会在今天晚些时候尝试看看它是否有效(抱歉花了这么长时间)。
    • 你真的不应该修改全局的、受保护的文件。事实上,这可能会中断服务,因此如果模板为错误修复或新功能而更新,您修改的文件将不会得到更新。相反,您可以在自己的 .csproj 中设置 &lt;OutputPath&gt;,它将覆盖全局设置(如果先导入)。这是 MSBuild 项目中的建议。
    • 我通过创建一个新模板解决了我的问题,并按照您的描述设置了输出目录,谢谢!
    • 在 Visual Studio 12 中,例如在 VC/Win32 下,我只看到一个 --rather void-- .VSTDIR 文件。请问有什么想法吗?
    【解决方案2】:

    这不是必须的。

    您的解决方案中的一个项目被标记为启动项目,在解决方案资源管理器窗口中以粗体显示。一个 EXE 项目,例如您的控制台模式应用程序。您使用 Project + Add Reference 添加对解决方案中其他项目的引用,以便您可以使用这些项目在控制台模式应用程序中生成的类库。

    这些引用将 Copy Local 属性设置为 True。

    当您构建项目时,MSBuild 会自动将程序集从它们各自的 bin\Debug 目录复制到控制台模式应用程序的 bin\Debug 目录中,这要归功于 Copy Local 设置。它也很聪明,可以查看这些类库的依赖关系并复制它们。

    所以在构建完成后,bin\Debug 目录将不仅有您的控制台模式项目的 EXE 文件,而且还有它需要正确执行的所有 DLL。

    有几种方法可能会出错,MSBuild 无法确定这种依赖关系确实存在。非常罕见,例如,您必须在代码中使用反射来加载程序集(Assembly.Load() 和朋友)。解决方法是在构建后事件中显式复制依赖项。你没有在你的问题中留下足够的面包屑来判断这是否是真正的问题。

    您所要求的当然是可能的,但 IDE 并没有让它变得容易,因为它的设计根本不是假设这是必要的。您必须将 Build + Output Path 设置替换为 ..\Debug。您可以使用已预设的设置创建自己的项目模板。创建一个新的类库项目,更改设置并使用 File + Export Template 创建模板。下次创建项目时就可以使用它了。

    但是,实际上,首先要找出默认复制本地机制不适合您的原因。

    【讨论】:

    • 将解决方案的所有项目输出到 1 个文件夹中是有意义的,它可以节省一些时间和空间(想想 SSD)围绕内部解决方案依赖项进行复制,因为它们只会存在于一个输出中文件夹
    • 这不是 MSBuild 的设计方式。您可以与构建系统抗争,但效率不高。不,你不会节省时间。复制构建输出文件是一种简单的内存到内存复制,它在现代机器上以超过 10 GB/秒的速度运行。需要半毫秒,你永远不会注意到它。所有人都欢呼文件系统缓存。如果您仍然想这样做,那么 MSBuild 不会阻止您,只会麻烦您。
    • 我想我的问题是这样表述的,它预设了它实际上是必要的。需要明确的是,我现在想这样做的原因(将来可能还有其他原因)是我喜欢将输入文件输入到程序中并将输出生成到文件中,这意味着我在调试时经常访问这些文件和发展。我想你会建议我将这些文件添加到我的项目中,从 Visual Studio 中编辑它们,并允许在构建期间复制它们 - 听起来是个好主意,尽管我必须考虑一下它是否会解决我遇到的每一个问题。
    • 这听起来很可疑。确保将调试时使用的数据保存在用户所做的相同位置。谁永远不会将它存储在与您的构建输出相同的位置。使用 %appdata% 是非常必要的。
    • 如果您的代码使用依赖反转,那么这将无法解决问题。我正在研究一个解决方案,其主要项目不(也不应该)依赖于编译解决方案上的某些其他项目,相反,另一个项目取决于主要项目。然而,在运行时,dll 需要在那里,它是动态加载的。
    【解决方案3】:

    您可以创建自己的 .targets 文件,根据需要更改 &lt;OutputPath&gt;,而不是更改全局受保护文件,并将其导入您的项目。这也可以设置您可能想要更改并且不想为每个项目执行的其他默认值。然后,您只需在项目文件中添加类似顶部的内容(当然是在根元素之后):

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

    【讨论】:

    • 这并不能真正回答我相信的问题,您仍然需要手动操作(甚至不使用 IDE)。您能解释一下如何“默认”自动将该导入添加到您的所有项目中吗?
    猜你喜欢
    • 2018-04-08
    • 2023-03-15
    • 1970-01-01
    • 2016-03-06
    • 2015-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多