【问题标题】:Create deployment package during build event在构建事件期间创建部署包
【发布时间】:2013-05-27 11:33:37
【问题描述】:
我有一个项目“A”,需要另一个项目“B”的部署包。
我希望这种情况自动发生,以便“A”依赖于“B”,并且在“A”的预构建事件中,为“B”制作部署包。
我知道如何手动执行此操作(右键单击“B”->构建部署包->构建“A”)并且它工作正常,但是如何按照描述自动化呢?
(“A”其实是一个WIX项目)
【问题讨论】:
标签:
visual-studio-2010
visual-studio
wix
webdeploy
build-events
【解决方案1】:
有两种方法可以做到这一点:
- 始终在 B 构建后构建 B 的包或
- 始终在构建 A 之前构建 B 的包
第一种的好处是A对B了解的少。第二种的好处是B可以在开发过程中构建,不需要构建包的步骤。
您可能知道,Visual Studio 项目是 MSBuild 项目。您可以在 Visual Studio 中编辑它们,方法是从解决方案资源管理器的项目上下文菜单中选择卸载项目,然后选择编辑。以这种方式添加构建步骤通常比通过构建事件编辑器更容易,有时甚至是必要的。如果想留下项目文件自定义的线索,可以在 Pre-build 事件字段中添加“rem”命令。
在以上两种情况下,项目B的Package target必须在项目A的Build目标之前运行。选择上面的第二种情况,将此MSBuild task添加到A的BeforeBuild目标中。
<MSBuild
Projects="relative-or-absolute/path/to/B.xxproj"
Targets="Package">
</MSBuild>
【解决方案2】:
我最终得到了这个预构建事件代码。不过汤姆斯解决方案可能更好。
echo off
set THEME_REGKEY=HKLM\Software\Microsoft\MSBuild\4.0
set THEME_REGVAL=MSBuildOverrideTasksPath
REM Check for presence of key first.
reg query %THEME_REGKEY% /v %THEME_REGVAL% 2>nul || (echo No theme name present! & exit /b 1)
REM query the value. pipe it through findstr in order to find the matching line that has the value. only grab token 3 and the remainder of the line. %%b is what we are interested in here.
set THEME_NAME=
for /f "tokens=2,*" %%a in ('reg query %THEME_REGKEY% /v %THEME_REGVAL% ^| findstr %THEME_REGVAL%') do (
set THEME_NAME=%%b
)
REM Possibly no value set
if not defined THEME_NAME (echo No theme name present! & exit /b 1)
REM replace any spaces with +
set THEME_NAME=%THEME_NAME: =+%
if errorlevel 1 goto BuildEventFailed
%THEME_NAME%MSBuild "$(SolutionDir)Web\Web.csproj" /t:Build;Package /p:Configuration=$(Configuration)