使用 MSBuild 在构建过程中导入目标
Import targets during build process with MSBuild
我正在使用 vcpkg 作为 Visual Studio C++ 项目的包管理器。我已经创建了基本设置 vcpkg 的初始目标(克隆 vcpkg 存储库并下载 vcpkg.exe):
<Target Name="EnsureVcpkgBuild" BeforeTargets="PrepareForBuild">
<Exec Command="git clone $(VcpkgRepo).git ..\packages\vcpkg" Condition="!Exists('..\packages\vcpkg\.git')" ContinueOnError="true" />
<Exec Command="git --git-dir=..\packages\vcpkg\.git --work-tree=..\packages\vcpkg pull --ff-only" Condition="Exists('..\packages\vcpkg\.git')" ContinueOnError="true" />
<Exec Command="..\packages\vcpkg\bootstrap-vcpkg.bat" Condition="!Exists('..\packages\vcpkg\vcpkg.exe')" ContinueOnError="true" />
<PropertyGroup>
<ErrorText>This project uses vcpkg that is missing on this computer. Manually download from $(VcpkgRepo) and place the contents in {0}. Or install git and add it to your path, for more information see https://git-scm.com. The missing file is {1}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\packages\vcpkg\vcpkg.exe')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\vcpkg\', '..\packages\vcpkg\vcpkg.exe'))" />
<Error Condition="!Exists('..\packages\vcpkg\scripts\buildsystems\msbuild\vcpkg.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\vcpkg\', '..\packages\vcpkg\scripts\buildsystems\msbuild\vcpkg.targets'))" />
</Target>
在我的项目中,我正在导入 vcpkg 目标文件:
<ImportGroup>
<Import Project="..\packages\vcpkg\scripts\buildsystems\msbuild\vcpkg.targets" Condition="Exists('..\packages\vcpkg\scripts\buildsystems\msbuild\vcpkg.targets')" />
</ImportGroup>
此设置可确保构建在 Visual Studio 中顺利进行,无需任何额外工作。但是,在使用 CI/CD 管道时,我必须先调用 EnsureVcpkgBuild
,然后再尝试构建项目。我能否以不必调用 EnsureVcpkgBuild
并启动构建自动设置 vcpkg 和导入 vcpkg.targets
的方式设置此项目?
可以直接使用nuget包自动实现。
我认为你写了一个目标来下载reop项目vcpkg
到本地,然后从下载的vcpkg
项目中手动导入核心目标。
在本地可以轻松完成,但在 cl 管道上,它不适合。
所以使用 nuget 会更容易。
只需将 nuget 包 Vcpkg.Nuget 安装到您的 C++ 项目中。
所有导入目标都在 nuget 包中,安装 nuget 后可以自动导入到您的项目中。
当您在 CI/CD 管道上时,只需添加一个 nuget restore task 即可恢复管道上的 nuget 包。
我正在使用 vcpkg 作为 Visual Studio C++ 项目的包管理器。我已经创建了基本设置 vcpkg 的初始目标(克隆 vcpkg 存储库并下载 vcpkg.exe):
<Target Name="EnsureVcpkgBuild" BeforeTargets="PrepareForBuild">
<Exec Command="git clone $(VcpkgRepo).git ..\packages\vcpkg" Condition="!Exists('..\packages\vcpkg\.git')" ContinueOnError="true" />
<Exec Command="git --git-dir=..\packages\vcpkg\.git --work-tree=..\packages\vcpkg pull --ff-only" Condition="Exists('..\packages\vcpkg\.git')" ContinueOnError="true" />
<Exec Command="..\packages\vcpkg\bootstrap-vcpkg.bat" Condition="!Exists('..\packages\vcpkg\vcpkg.exe')" ContinueOnError="true" />
<PropertyGroup>
<ErrorText>This project uses vcpkg that is missing on this computer. Manually download from $(VcpkgRepo) and place the contents in {0}. Or install git and add it to your path, for more information see https://git-scm.com. The missing file is {1}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\packages\vcpkg\vcpkg.exe')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\vcpkg\', '..\packages\vcpkg\vcpkg.exe'))" />
<Error Condition="!Exists('..\packages\vcpkg\scripts\buildsystems\msbuild\vcpkg.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\vcpkg\', '..\packages\vcpkg\scripts\buildsystems\msbuild\vcpkg.targets'))" />
</Target>
在我的项目中,我正在导入 vcpkg 目标文件:
<ImportGroup>
<Import Project="..\packages\vcpkg\scripts\buildsystems\msbuild\vcpkg.targets" Condition="Exists('..\packages\vcpkg\scripts\buildsystems\msbuild\vcpkg.targets')" />
</ImportGroup>
此设置可确保构建在 Visual Studio 中顺利进行,无需任何额外工作。但是,在使用 CI/CD 管道时,我必须先调用 EnsureVcpkgBuild
,然后再尝试构建项目。我能否以不必调用 EnsureVcpkgBuild
并启动构建自动设置 vcpkg 和导入 vcpkg.targets
的方式设置此项目?
可以直接使用nuget包自动实现。
我认为你写了一个目标来下载reop项目vcpkg
到本地,然后从下载的vcpkg
项目中手动导入核心目标。
在本地可以轻松完成,但在 cl 管道上,它不适合。
所以使用 nuget 会更容易。
只需将 nuget 包 Vcpkg.Nuget 安装到您的 C++ 项目中。
所有导入目标都在 nuget 包中,安装 nuget 后可以自动导入到您的项目中。
当您在 CI/CD 管道上时,只需添加一个 nuget restore task 即可恢复管道上的 nuget 包。