许多项目在构建过程中需要使用其他工具来生成源代码以进行进一步编译或执行其他自定义构建任务。VC项目一直支持自定义构建工具集成,但它有一些局限性。UserVoice上流行的请求之一是 允许自定义生成工具并行运行 . 另一个问题是,通常自定义生成输出需要传递给其他构建工具(例如,一些工具可以生成C/C++源,这些源需要传递给编译器),并且没有简单的方法来指定。
为了解决这些问题,我们在VisualStudio201715.8中添加了对自定义构建工具并行执行的支持,以及更易于构建集成的新选项。
另外,最常见的构建自定义之一是复制文件。在此之前,我们建议使用“自定义构建步骤”或“自定义构建工具”并在其中指定复制命令。现在您可以使用简单的复制文件选项。
自定义生成工具选项
如果您熟悉自定义生成工具的用法,可以跳过此部分,转到“新建自定义生成工具选项”。
自定义生成工具选项在“项目属性”中不可见,除非至少有一个文件使用“自定义生成工具”作为其“项类型”。您可以在文件的“常规”属性中进行设置:
至于其他工具,您可以为每个文件设置“自定义生成工具”属性,但通常在项目配置级别设置它们比较容易,因此它们适用于使用“自定义生成工具”的所有文件。请注意,您可以使用 MSBuild已知项元数据 没有指定特定于文件的选项。不幸的是,您不能使用其他项属性,因为不能保证在使用它们之前定义它们。
命令行
指定要在cmd.exe中执行的命令。如果要对同一个文件执行多个命令,可以将它们添加到脚本文件中,也可以只在“特性编辑器”中输入它们,每个命令位于单独的一行:
说明
指定在执行命令之前要打印的消息(可选)。它是作为“echo”命令添加的,因此如果要使用“>”符号,则需要对其进行转义:“^>”。
输出
指定自定义生成工具生成的输出文件。
附加依赖项
指定要用于自定义生成工具的任何其他输入文件。增量生成需要。
链接对象
指定是否将具有特定扩展名(.obj、.lib、.res、.rsc)的输入和输出文件传递给链接器。此属性是在VS 2010中添加的,用于维护msbuild前vc项目(VS 2009及以前版本)的行为,其中文件扩展名决定对这些项目执行哪个生成操作。
MSBuild正在对包含在特定命名项组(项类型)中的项进行操作,因此建议改用新的“将输出添加到项类型”属性。
将输出视为内容
指定输出文件是否为可部署内容。仅用于支持打包的项目(通用Windows)。
内容根文件夹
用于打包的内容根文件夹。
之后执行,之前执行
定义何时执行自定义生成工具和自定义生成步骤命令。由于历史原因,他们同时被处决。这些选项使用的是msbuild目标名称,这要求您在生成期间了解msbuild目标的执行顺序。在下拉列表中有一个长长的列表,你可以从中选择目标,也可以在其中键入目标名称,但是通常你只需要选择下面的一个目标,这些目标代表C++构建的3个主要步骤:
- 构建生成资源
- 编译
- 构建链接
如果您的定制构建需要在更精确的时间内执行,那么您可能需要查看详细的(或二进制的)构建日志—您将看到在构建期间执行的所有目标及其顺序。
新的自定义生成工具选项
将输出添加到项目类型
如果希望自定义生成输出成为另一个生成操作的输入,可以在此处指定。
例如,如果要编译输出,则需要将它们添加到“C/C++编译器”项类型中。您还需要通过在“C/C++编译”中设置“执行后”到“构建生成资源”或“执行之前”到“编译编译”来执行自定义构建工具。
并行构建
指定此项可以与其他自定义生成工具项并行生成。
最大进程数
用于并行生成的最大CPU内核数。值为0将使用所有可用的处理器。
最大批量
并行生成期间在一个cmd.exe进程中一起执行的最大项目数。值为0时,将项均匀地划分为平行批。值为1将禁用批处理。启动cmd.exe进程需要一些时间,因此如果自定义生成工具快速处理项目,则较大的批处理将提高性能。如果定制构建需要大量时间,那么禁用批处理将为您提供更好的错误报告。
复制文件选项
如果在构建期间需要将文件复制到一个或多个位置,首先需要将其“Item Type”更改为“copy file”并应用。然后您将看到“复制文件”属性。
同样,您可以为单个文件定义选项,或者,如果它们相似,则使用 MSBuild已知项元数据 :
目标目录
可以指定一个或多个目录(用“;”分隔)将文件复制到。默认值为$(OutDir)。
目标文件名
可以指定目标文件的文件名。默认值与源相同:%%(文件名)%%(扩展名)。
其他属性类似于自定义生成工具和自定义生成步骤:您可以设置目标文件是否应包含在包中,以及在生成期间何时复制文件。
向我们发送反馈
请下载 Visual Studio 2017版本15.8 并尝试新的自定义生成工具和复制文件功能。我们很想知道它是如何为您工作。请通过下面的评论或电子邮件给我们反馈( visualcpp@microsoft.com ). 一般问题请 报告问题。