0

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

我希望这种情况自动发生,以便“A”依赖于“B”,并且在“A”的预构建事件中,部署包是为“B”制作的。

我知道如何手动执行此操作(右键单击“B”->构建部署包->构建“A”)并且它工作正常,但是如何按照描述自动化它呢?

(“A”其实是一个WIX项目)

4

2 回答 2

2

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

  1. 始终在构建 B 之后构建 B 的包或
  2. 总是在构建 A 之前构建 B 的包

第一个的好处是 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>
于 2013-05-27T13:36:48.870 回答
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)
于 2013-05-28T08:23:42.917 回答