构建解决方案/项目/程序意味着什么?我想确保我的定义是正确的(所以我在交谈时听起来不像个白痴)。在 IDE 中,您可以(如果我错了,请纠正我)将源代码/编程代码编译成计算机可读的机器代码。您可以调试一个程序,这基本上是单步调试程序并查找错误。
但是构建一个程序到底有什么作用呢?在 VS 中,我知道当您构建程序时,它会在调试文件夹中生成一个可执行文件。
任何关于构建程序意味着什么的核心技术定义?
构建解决方案/项目/程序意味着什么?我想确保我的定义是正确的(所以我在交谈时听起来不像个白痴)。在 IDE 中,您可以(如果我错了,请纠正我)将源代码/编程代码编译成计算机可读的机器代码。您可以调试一个程序,这基本上是单步调试程序并查找错误。
但是构建一个程序到底有什么作用呢?在 VS 中,我知道当您构建程序时,它会在调试文件夹中生成一个可执行文件。
任何关于构建程序意味着什么的核心技术定义?
构建对很多人来说意味着很多事情,但总的来说,它意味着从开发人员生成的源文件开始,到准备好部署的安装包之类的东西结束。
“构建”可以包含许多内容:
“构建”可以“手动”完成,也可以自动完成,或者两者兼而有之。手动构建是需要像编译器这样的构建命令一个一个地执行的构建。自动构建将所有单独的构建工具打包到一个大型构建程序中,该程序可以(理想情况下)在一个步骤中运行。
许多项目涉及大量源文件。原则上,您可以自己手动编译这些文件中的任何一个——您使用编译器将该源文件编译为包含机器代码的(临时)目标文件。
在实践中,一次手动编译每个源文件太乏味了,手动跟踪哪些源文件需要重新编译更乏味。因此,我们通过运行自动构建程序(通常称为“make”)一次构建整个项目。该程序遍历源文件列表,通常存储在另一个名为“makefile”的“源”文件中,并在每个文件上调用编译器——许多版本的“make”足够聪明,只能重新编译已更改的文件所以需要重新编译。
虽然编译可以说是构建过程中最重要的部分,但“构建”通常会在编译器之后运行许多其他程序。有时,一个完整的构建将花费更多的时间来运行这些其他程序,而不是运行编译器。
例如,许多人发现一个按钮不仅可以将所有源代码编译到最新版本,而且还可以运行一系列标准测试(C2:One Button Testing),这很方便。因此,makefile 还列出了运行这些测试所需的任何命令,这些命令成为构建过程的一部分。
它意味着将人类可读的源工件转换为机器可读的工件的过程。
这不一定与人类对“构建”的含义有关,但就 MSBuild 2.0 而言,Microsoft.Common.targets 中的代码如此描述它:
...
<!--
============================================================
Build
The main build entry point.
============================================================
-->
<PropertyGroup>
<BuildDependsOn>
BeforeBuild;
CoreBuild;
AfterBuild
</BuildDependsOn>
</PropertyGroup>
<Target
Name="Build"
Condition=" '$(_InvalidConfigurationWarning)' != 'true' "
DependsOnTargets="$(BuildDependsOn)"
Outputs="$(TargetPath)"/>
<!--
============================================================
BeforeBuild
Redefine this target in your project in order to run tasks just before Build
============================================================
-->
<Target Name="BeforeBuild"/>
<!--
============================================================
AfterBuild
Redefine this target in your project in order to run tasks just after Build
============================================================
-->
<Target Name="AfterBuild"/>
<!--
============================================================
CoreBuild
The core build step calls each of the build targets.
============================================================
-->
<PropertyGroup>
<CoreBuildDependsOn>
BuildOnlySettings;
PrepareForBuild;
PreBuildEvent;
UnmanagedUnregistration;
ResolveReferences;
PrepareResources;
ResolveKeySource;
Compile;
GenerateSerializationAssemblies;
CreateSatelliteAssemblies;
GenerateManifests;
GetTargetPath;
PrepareForRun;
UnmanagedRegistration;
IncrementalClean;
PostBuildEvent
</CoreBuildDependsOn>
</PropertyGroup>
<Target
Name="CoreBuild"
DependsOnTargets="$(CoreBuildDependsOn)">
<OnError ExecuteTargets="_TimeStampAfterCompile;PostBuildEvent" Condition="'$(RunPostBuildEvent)'=='Always' or '$(RunPostBuildEvent)'=='OnOutputUpdated'"/>
<OnError ExecuteTargets="_CleanRecordFileWrites"/>
</Target>
...
这表明“构建”大致意味着“编译加上所有相关的辅助事件,这些事件使您从代码工件到可部署的结果”。