MS-Build BeforeBuild未触发

时间:2010-07-28 11:10:04

标签: c# msbuild csproj prebuild

我正在自定义一个.csproj项目,以便在主构建之前运行一些自定义任务。但是,我根本无法执行任务。

我取消注释了<Target Name="BeforeBuild" />文件中的.csproj元素,并添加了一个简单的Message任务,但是当我构建时,消息没有出现在我的输出中,所以似乎任务不是运行。所以这个片段不会输出消息;

清单1:没有显示消息

<Target Name="BeforeBuild">
    <Message Text="About to build ORM layer" Importance="normal" />
</Target>

但是,如果我搞砸了一些属性,我可能会让.csproj无法执行;

清单2:MSBuild配置错误

<Target Name="BeforeBuild">
    <Message Text="About to build ORM layer" XXImportance="normal" />
</Target>

请注意XXImportance属性。我得到的构建错误是

My.csproj(83,46): error MSB4064: The "XXImportance" parameter is not supported by the "Message" task. Verify the parameter exists on the task, and it is a settable public instance property.

这表明正在解析XML,已找到Message类,并且该类正在反映可用属性。

为什么不执行任务?

我正在使用3.5框架。

更新1:根据@ Martin的建议,我尝试在控制台上运行MSBuild,并出现此错误;

c:\path\to\my.csproj(74,11): error MSB4019: The imported
project "C:\Microsoft.CSharp.targets" was not found. Confirm
that the path in the <Import> declaration is correct, and that
the file exists on disk.

第74行读取;

<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

更新2:我正在使用C#3编译器编译VS2008,但我正在编译的项目是一个框架2.0项目。从命令行运行时(请参阅更新1),构建似乎失败,因为对于Microsoft.CSharp.targets文件的指定位置存在混淆。

3 个答案:

答案 0 :(得分:19)

今天遇到同样的问题,并找到了使其发挥作用的方法。

.csproj文件中的BeforeBuild目标旨在重新定义Microsoft.Common.targets文件中定义(和引用)的目标,该文件由Microsoft.CSharp.targets文件导入,而该文件又是由.csproj导入。

您的问题是.csproj中导入Microsoft.CSharp.targets的行是在您定义BeforeBuild目标之后。将导入行移动到BeforeBuild目标上方,一切都应该正常。

希望有所帮助,

答案 1 :(得分:14)

事件正在触发,但您可能需要在VS中更改设置:

  

工具 - &gt;选项 - &gt;项目和   解决方案 - &gt;构建并运行:

     

并将MSBUild详细程度设置为最小或正常。

此外,如果您在控制台中通过msbuild进行编译,则无需更改上述设置即可看到该消息。

答案 2 :(得分:2)

Visual Studio中有一项功能允许您debug MSBuild。你可以试试。它是官方不受支持但有用的。