Visual Studio 2010与MSBuild生成后事件

Visual Studio 2010与MSBuild生成后事件,msbuild,post-build-event,Msbuild,Post Build Event,我有很多项目的解决方案 在生成后事件中检查主项目程序集的版本,并从Trac RSS中提取与该版本相关联的发行说明,并将其存储为XML文件,以便与应用程序一起提供。这是在生成后事件中完成的 主程序集项目的生成后事件: Powershell -File "$(SolutionDir)scripts\makereleasenotes.ps1" $(TargetPath) $(ProjectDir) 这在VS中效果很好 但是,当我们构建部署时,会发生许多其他步骤,因此有一个命令行msbuild,它通过

我有很多项目的解决方案

在生成后事件中检查主项目程序集的版本,并从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"/>

以及:

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

将解决方案设置为msbuild脚本中的目标时,是否应运行从属项目的生成后脚本

如果是这样,是什么阻止了我的跑步


如果没有,我假设我必须单独运行它,并为项目级宏(powershell脚本正在使用它检查程序集并编写发行说明XML)提供等效参数。

我对MSBuild比较陌生,但我发现您的问题已经在那里等待了4个小时没有答案

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

第二,也许可以将其他简单的helloworld类型的命令添加到构建事件命令中。有助于打印有关宏解析的调试信息的内容。也许是一些回音命令


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

我是MSBuild的新手,但我知道你的问题已经在那里坐了4个小时没有回答了

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

第二,也许可以将其他简单的helloworld类型的命令添加到构建事件命令中。有助于打印有关宏解析的调试信息的内容。也许是一些回音命令


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

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

您不能只在后期生成中向参数添加双引号,因为$(ProjectDir)marco将扩展为DRIVE:\something\something\当您在其周围加上“”时,您只会以“DRIVE:\something\something\”结束,它实际上将尾部的\“扩展为”而不是\-这会完全搞乱它


结果只是删除了空格,这样参数就完整了,不需要弄清楚如何在生成后脚本中使用引号。

问题是由生成路径和宏中的空格引起的(特别是$ProjectDir,以a结尾)。构建脚本将路径设置为包含格式为“yyyy-MM-dd-HH-MM”的空格。这表明Powershell的参数在由这些空格指示时无效

您不能只在后期生成中向参数添加双引号,因为$(ProjectDir)marco将扩展为DRIVE:\something\something\当您在其周围加上“”时,您只会以“DRIVE:\something\something\”结束,它实际上将尾部的\“扩展为”而不是\-这会完全搞乱它


结果只是删除了空格,这样参数就完整了,不需要弄清楚如何在后期构建脚本中使用引号。

我已经输入了
echo'post build'>$(SolutionDir)status.txt
没有发生任何事情,但没有尝试其他文件夹-您可能在那里找到了一些东西-我明天早上会检查。这至少让我找到了解决问题的正确途径。我已经输入了一个
echo'post build'>$(SolutionDir)status.txt
没有发生任何问题,但没有尝试其他文件夹-您可能在那里找到了一些东西-我明天早上会检查。这至少让我找到了正确的解决方法。很高兴听到您找到了答案。:)我也有同样的问题。您可以在宏的末尾添加另一个反斜杠,然后用引号将其括起来。例如
Foo“$(ProjectDir)\”
,它扩展到例如
Foo“C:\Bar Baz\Boop Bap\\”
。双反斜杠被弄乱了,剩下一个带空格的带引号的字符串,它将被解释为一个参数。很高兴听到您解决了这个问题。:)我也有同样的职业球员
<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.