如何使用 cake MSBuild 构建 Visual Studio Installer .vdproj?
How to build Visual Studio Installer .vdproj with cake MSBuild?
build.cake是这样的:
Task("Build")
.Does(() =>
{
MSBuild("./xxx.sln", new MSBuildSettings {
Verbosity = Verbosity.Minimal,
ToolVersion = MSBuildToolVersion.VS2015,
Configuration = "Release",
});
});
xxx.sln 包含 xxx_Setup.vdproj,但当我 运行
时它没有构建
.\build.ps1 -Target Build
根据这个讨论,它会出现:
MSBuild 不支持构建 vdproj 文件。相反,这是 Visual Studio 知道如何做的事情,但 MSBuild 不知道,
此博客进一步支持了这一点 post:
http://techproblemssolved.blogspot.co.uk/2009/05/msbuild-and-vdproj-files.html
在这两种情况下,建议的解决方法是:
- 转向另一种封装技术,例如 WiX。
- 直接调用Visual Studio(即devenv.exe)构建项目
这取决于你如何进行,但是,就我个人而言,我不喜欢第二种选择。
可能不推荐这种方式,但如果您在构建代理上安装了 VisualStudio,则可以利用它通过 VisualStudio 命令行开关构建安装程序。
要构建安装程序,请务必先构建应用程序,然后再构建安装程序,否则您很可能会 运行 陷入 运行 时间错误。
Cake 中没有用于 VisualStudio 命令行的内置别名 (devenv.com
),但您可以启动该进程,或者像我下面的示例一样劫持 MSBuild
别名。
示例项目
示例项目将有一个名为 "TheApp" 的应用程序和一个名为 "TheInstaller" 的安装程序,如下所示:
build.cake
我创建了一个最小的蛋糕脚本来演示如何首先使用 MSBuild 构建项目,然后使用 VisualStudio 安装程序。通常你会有 clean/nuget 恢复等任务
FilePath vsToolPath = "C:/Program Files (x86)/Microsoft Visual Studio 14.0/Common7/IDE/devenv.com";
FilePath solutionPath = "./InstallerTest.sln";
FilePath appProjectPath = " ./TheApp/TheApp.csproj";
string configuration = "Release";
Task("Build")
.Does(() =>
{
// Build project
MSBuild(appProjectPath, new MSBuildSettings {
Verbosity = Verbosity.Minimal,
Configuration = configuration
});
// Build installer
MSBuild(solutionPath, new MSBuildSettings {
ToolPath = vsToolPath,
ArgumentCustomization = args=>new ProcessArgumentBuilder()
.AppendQuoted(solutionPath.FullPath)
.Append("/build")
.Append(configuration)
.Append("/project")
.Append("TheInstaller")
});
});
RunTarget("Build");
- vsToolPath 是devenv.com(位于devenv.exe)
- solutionPath 是解决方案文件的路径
- appProjectPath 是应用程序 csproj/project 文件的路径
- 配置是要构建的配置,即发布/调试。
示例输出
如果一切顺利,您应该会看到类似于下面的构建日志
C:\InstallerTest> cake .\build.cake
========================================
Build
========================================
Microsoft (R) Build Engine version 14.0.25420.1
Copyright (C) Microsoft Corporation. All rights reserved.
TheApp -> C:\InstallerTest\TheApp\bin\Release\TheApp.exe
Microsoft Visual Studio 2015 Version 14.0.25420.1.
Copyright (C) Microsoft Corp. All rights reserved.
------ Starting pre-build validation for project 'TheInstaller' ------
------ Pre-build validation for project 'TheInstaller' completed ------
1>------ Build started: Project: TheInstaller, Configuration: Release ------
Building file 'C:\InstallerTest\TheInstaller\Release\TheInstaller.msi'...
========== Build: 1 succeeded, 0 failed, 1 up-to-date, 0 skipped ==========
Task Duration
--------------------------------------------------
Build 00:00:06.2353275
--------------------------------------------------
Total: 00:00:06.2353275
build.cake是这样的:
Task("Build")
.Does(() =>
{
MSBuild("./xxx.sln", new MSBuildSettings {
Verbosity = Verbosity.Minimal,
ToolVersion = MSBuildToolVersion.VS2015,
Configuration = "Release",
});
});
xxx.sln 包含 xxx_Setup.vdproj,但当我 运行
时它没有构建.\build.ps1 -Target Build
根据这个讨论,它会出现:
MSBuild 不支持构建 vdproj 文件。相反,这是 Visual Studio 知道如何做的事情,但 MSBuild 不知道,
此博客进一步支持了这一点 post:
http://techproblemssolved.blogspot.co.uk/2009/05/msbuild-and-vdproj-files.html
在这两种情况下,建议的解决方法是:
- 转向另一种封装技术,例如 WiX。
- 直接调用Visual Studio(即devenv.exe)构建项目
这取决于你如何进行,但是,就我个人而言,我不喜欢第二种选择。
可能不推荐这种方式,但如果您在构建代理上安装了 VisualStudio,则可以利用它通过 VisualStudio 命令行开关构建安装程序。
要构建安装程序,请务必先构建应用程序,然后再构建安装程序,否则您很可能会 运行 陷入 运行 时间错误。
Cake 中没有用于 VisualStudio 命令行的内置别名 (devenv.com
),但您可以启动该进程,或者像我下面的示例一样劫持 MSBuild
别名。
示例项目
示例项目将有一个名为 "TheApp" 的应用程序和一个名为 "TheInstaller" 的安装程序,如下所示:
build.cake
我创建了一个最小的蛋糕脚本来演示如何首先使用 MSBuild 构建项目,然后使用 VisualStudio 安装程序。通常你会有 clean/nuget 恢复等任务
FilePath vsToolPath = "C:/Program Files (x86)/Microsoft Visual Studio 14.0/Common7/IDE/devenv.com";
FilePath solutionPath = "./InstallerTest.sln";
FilePath appProjectPath = " ./TheApp/TheApp.csproj";
string configuration = "Release";
Task("Build")
.Does(() =>
{
// Build project
MSBuild(appProjectPath, new MSBuildSettings {
Verbosity = Verbosity.Minimal,
Configuration = configuration
});
// Build installer
MSBuild(solutionPath, new MSBuildSettings {
ToolPath = vsToolPath,
ArgumentCustomization = args=>new ProcessArgumentBuilder()
.AppendQuoted(solutionPath.FullPath)
.Append("/build")
.Append(configuration)
.Append("/project")
.Append("TheInstaller")
});
});
RunTarget("Build");
- vsToolPath 是devenv.com(位于devenv.exe)
- solutionPath 是解决方案文件的路径
- appProjectPath 是应用程序 csproj/project 文件的路径
- 配置是要构建的配置,即发布/调试。
示例输出
如果一切顺利,您应该会看到类似于下面的构建日志
C:\InstallerTest> cake .\build.cake
========================================
Build
========================================
Microsoft (R) Build Engine version 14.0.25420.1
Copyright (C) Microsoft Corporation. All rights reserved.
TheApp -> C:\InstallerTest\TheApp\bin\Release\TheApp.exe
Microsoft Visual Studio 2015 Version 14.0.25420.1.
Copyright (C) Microsoft Corp. All rights reserved.
------ Starting pre-build validation for project 'TheInstaller' ------
------ Pre-build validation for project 'TheInstaller' completed ------
1>------ Build started: Project: TheInstaller, Configuration: Release ------
Building file 'C:\InstallerTest\TheInstaller\Release\TheInstaller.msi'...
========== Build: 1 succeeded, 0 failed, 1 up-to-date, 0 skipped ==========
Task Duration
--------------------------------------------------
Build 00:00:06.2353275
--------------------------------------------------
Total: 00:00:06.2353275