0

我有许多项目的解决方案。

在构建后事件中检查主项目的程序集版本,并从 Trac RSS 中提取与该版本关联的发行说明,并将其存储为 XML 文件以与应用程序一起提供。这是在构建后事件中完成的。

主程序集的项目的构建后事件:

Powershell -File "$(SolutionDir)scripts\makereleasenotes.ps1" $(TargetPath) $(ProjectDir)

这在 VS 中运行良好。

然而,当我们构建部署时,会发生许多其他步骤,因此有一个命令行 msbuild,它可以通过双击运行,它会执行构建并打包部署。

从这个过程运行时,构建后步骤似乎没有运行。

这是我们使用的命令脚本:

set app_main=%CD%
msbuild app.msbuild /target:Release;Cleanup

app.msbuild 有一个目标,然后包含其他目标:

<Target Name="Release" DependsOnTargets="CreateDir;BuildRelease;CopyFiles"/>

和:

<Target Name="BuildRelease" > 

    <MSBuild Projects="App.Web.Application.sln" Properties="Platform=$(Platform);Configuration=Release; 
             OutDir=$(ReleaseDir)\$(DTResult)\$(ReleaseConfiguration)\" 
             Targets="Clean;Rebuild"> 
             <Output ItemName ="OutputFiles" TaskParameter="TargetOutputs"/>

    </MSBuild>

    etc.

因此,您可以看到我们的外部 msbuild 脚本委托给了解决方案,并且在我们的构建中没有单独的项目正在编译。

当解决方案设置为 msbuild 脚本中的目标时,是否应该运行从属项目的构建后脚本?

如果是这样,是什么阻止了我的运行?

如果不是,我假设我必须单独运行它,并为项目级宏提供等效参数(powershell 脚本用于检查程序集并写出发行说明 XML)?

4

2 回答 2

2

该问题是由构建路径和宏(特别是 $ProjectDir 以 a 结尾)中的空格引起的。构建脚本将路径设置为包含“yyyy MM dd HH-mm”形式的空格。当被这些空格分隔时,Powershell 的参数无效。

您不能只在构建后的参数中添加双引号,因为 $(ProjectDir) 宏扩展为 DRIVE:\something\something\ 并且当您在此周围加上 "" 时,您最终会得到 "DRIVE:\something \something\" 实际上将尾随 \" 扩展为 " 而不是 \ - 这完全搞砸了。

最后只是删除了空格,以便参数是完整的,并且不需要弄清楚如何让引号在构建后脚本中起作用。

于 2012-09-06T19:47:23.130 回答
1

我是 MSBuild 的相对新手,但我看到你的问题已经坐了 4 个小时没有答案。

首先,我唯一能想到的是您在构建后事件中使用宏 $(SolutionDir) 传递给 powershell 脚本。也许这正在解决到您不期望的目录,因此 powershell 找不到它。我个人从不使用任何与解决方案相关的宏,但这只是我。当我需要保留返回 MSBuild 文件的路径时,我总是使用 $(MSBuildThisFileDirectory) 因为我认为它比其他宏更早得到解决。简而言之,也许 $(SolutionDir) 解决得太晚了?

其次,也许您可​​以在构建事件命令中添加其他简单的 hello world 类型命令。有助于打印出有关您的宏正在解析的调试信息的东西。也许一些回声命令?

抱歉,如果这没有帮助,但是如果不查看您的实际构建配置,很难说。

于 2012-09-06T02:14:15.213 回答