我有一个项目“A”需要另一个项目“B”的部署包。
我希望这种情况自动发生,以便“A”依赖于“B”,并且在“A”的预构建事件中,部署包是为“B”制作的。
我知道如何手动执行此操作(右键单击“B”->构建部署包->构建“A”)并且它工作正常,但是如何按照描述自动化它呢?
(“A”其实是一个WIX项目)
我有一个项目“A”需要另一个项目“B”的部署包。
我希望这种情况自动发生,以便“A”依赖于“B”,并且在“A”的预构建事件中,部署包是为“B”制作的。
我知道如何手动执行此操作(右键单击“B”->构建部署包->构建“A”)并且它工作正常,但是如何按照描述自动化它呢?
(“A”其实是一个WIX项目)
有两种方法可以做到这一点:
第一个的好处是 A 对 B 的了解更少。第二个的好处是 B 可以在开发过程中构建,而无需构建包的步骤。
您可能知道,Visual Studio 项目是 MSBuild 项目。您可以在 Visual Studio 中编辑它们,方法是从解决方案资源管理器的项目上下文菜单中选择卸载项目,然后选择编辑。以这种方式添加构建步骤通常比通过构建事件编辑器更容易,有时甚至是必要的。如果您想留下有关项目文件自定义的线索,您可以在 Pre-build 事件字段中添加“rem”命令。
在以上两种情况下,项目B的Package目标必须在项目A的Build目标之前运行。选择上面的第二种情况,将此MSBuild任务添加到A的BeforeBuild目标中。
<MSBuild
Projects="relative-or-absolute/path/to/B.xxproj"
Targets="Package">
</MSBuild>
我最终得到了这个预构建事件代码。不过汤姆斯的解决方案可能更好。
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)