如何在一个文件夹中构建所有项目?

13

有没有一种方法可以将解决方案构建到一个单独的文件夹中?我有几个项目在这个解决方案中,每个项目都访问应该在当前目录中的配置文件。我只是将每个项目的构建文件移动到一个文件夹中,它仍然可以工作,但是看起来非常不整洁。我想知道是否还有其他方法来完成这项任务。


为什么“应该”将配置文件放在当前目录中?您是指将每个项目的构建文件移动到一个目录中吗?这个“一个”指的是哪个?一个目录?一个构建文件?一个配置文件?当提到“配置文件”时,您是否指运行时加载的配置文件?它们与构建文件有何关系?请澄清您的文本。 - O. R. Mapper
您可以配置输出文件夹。但通常,一个解决方案中不应该有太多主要应用程序(EXE),每个应用程序都应该有自己的配置文件。 - H H
我有2个控制台应用程序(2个项目文件)。另一个控制台应用程序更改配置文件的内容,而另一个控制台应用程序根据该配置文件执行主要操作。 - user3068522
1
@user3068522:这样的配置文件通常应该放在某个特定于用户的目录中(例如AppData),即使只是因为可执行文件所在的目录(我知道不包括开发期间,但在可能的实际生产环境中)通常不可被用户写入。 - O. R. Mapper
5个回答

14

在解决方案中的每个项目的设置中(如果我们是关于Visual Studio),您可以设置输出目录。菜单:项目 - > 属性 - > 构建 - > 输出路径。例如,我使用..\ Build \ 将项目构建到解决方案根目录的Build目录中。


11
这篇MSDN文章讲解了如何以一种简洁、DRY的方式实现它: https://blogs.msdn.microsoft.com/kirillosenkov/2015/04/04/using-a-common-intermediate-and-output-directory-for-your-solution/ 它允许您仅指定这些目录一次,并在多个项目中使用这些设置。
步骤:
  1. Create a single common.props file in solution, that will specify and overwrite output and intermediate paths for a project to a common directory (like "Solution/bin"). Here is a sample *.props file that I found linked in the article:

    <?xml version="1.0" encoding="utf-8"?>
    <Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
        <PropertyGroup>
            <SolutionDir>$(MSBuildThisFileDirectory)</SolutionDir>
            <Configuration Condition="$(Configuration) == ''">Debug</Configuration>
            <OutputPath>$(SolutionDir)\bin\$(Configuration)\</OutputPath>
            <OutDir>$(OutputPath)</OutDir>
            <OutDir>$(OutputPath)</OutDir>
            <IntermediateOutputPath>
                $(SolutionDir)\obj\$(Configuration)\$(MSBuildProjectName)\
            </IntermediateOutputPath>
            <UseCommonOutputDirectory>False</UseCommonOutputDirectory>
            <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
        </PropertyGroup>
    </Project>
    
  2. Include this file into every *.csproj that you want to set the common output dirs for, by adding this line (the actual path may differ): <Import Project="..\Common.props" />


非常好的解决方案!唯一的缺点是,仍然需要修改每个 .csproj 文件。但是,在那之后,(可能的)未来更改会变得更加容易。 - Andreas Reiff
我现在已经更新了答案,使用了Directory.Build.props来解决这个问题。 - undefined

7

您可以更改项目的“输出路径”,默认情况下是给定项目的bin目录。

右键单击每个项目,从上下文菜单中选择属性,然后选择生成选项卡。在输出部分底部更改输出路径:。为每个项目设置相同的路径。

我同意您问题下面的评论,您不应该更改它。相反,您可以创建一个后置构建操作(PS脚本),将所有文件从项目的bin目录复制到您指定的目录。

更新:

将此脚本设置为后置构建命令(项目属性->生成事件选项卡->后置构建事件命令行):

xcopy "$(TargetDir)*" "$(SolutionDir)Build" /s /i /Y


1

对于每个项目:

  1. 进入项目属性,在“生成”选项卡中。
  2. 选择“所有配置”,“所有平台”,以防万一。
  3. 在输出文件夹中编写“..\bin\”(或任何对于它们都是统一的路径-不在当前项目目录中)。或者,为EXE项目添加一个App.config文件,并在其中探测所有DLL,以便它们可以在运行时被找到和加载。如果要将DLL组织到子文件夹中,则可以在输出路径中编写“..\bin\子项目目录”。

0
请注意,如果我们正在讨论将多个可执行文件构建到同一输出目录中,您还可以将它们作为项目引用添加到主(启动)项目中。每次构建主项目时,它们都会自动复制到主项目输出目录中。
(注意:这适用于VS 2017或VS 2019中的.NET Core项目。我不确定它是否适用于.NET Framework项目)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接