在构建事件期间创建部署包

时间:2013-05-27 11:33:37

标签: visual-studio-2010 visual-studio wix webdeploy build-events

我有一个项目" A"需要另一个项目的部署包" B"。

我希望这会自动发生,以便" A"取决于" B"并且在" A"的预建事件中部署包是为" B"。

我知道如何手动执行此操作(右键单击" B" - >构建部署包 - >构建" A")并且工作正常,但如何自动执行此操作如上所述?

(" A"实际上是一个WIX项目)

2 个答案:

答案 0 :(得分:2)

有两种方法可以做到这一点:

  1. 在构建B之后始终构建B的包或
  2. 在构建A之前始终构建B的包
  3. 第一个的优点是A必须更少了解B.第二个优点是B可以在开发过程中构建而无需构建包的步骤。

    您可能知道,Visual Studio项目是MSBuild项目。您可以在Visual Studio中编辑它们,方法是选择卸载项目,然后从解决方案资源管理器中的项目上下文菜单中选择编辑。与构建事件编辑器相比,以这种方式添加构建步骤通常更容易,有时也是必需的。如果您想了解项目文件的自定义,可以在预构建事件字段中添加“rem”命令。

    在上述任何一种情况下,项目B的Package target必须在项目A的构建目标之前运行。选择上面的第二种情况,将此MSBuild task添加到A的BeforeBuild目标。

    <MSBuild
        Projects="relative-or-absolute/path/to/B.xxproj"
        Targets="Package">
    </MSBuild>
    

答案 1 :(得分:0)

我最终得到了这个预构建事件代码。汤姆斯解决方案虽然可能更好。

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)