MS-Build的BeforeBuild未触发

17

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

我取消注释了.csproj文件中的<Target Name="BeforeBuild" />元素,并添加了一个简单的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: 任务“Message”不支持“XXImportance”参数。请确认该参数在任务上存在,并且它是一个可设置的公共实例属性。

这表明正在解析 XML,已找到 Message 类,并且正在反射其中可用的属性。

为什么任务不会执行?

我正在使用 3.5 框架。

更新1: 在 @Martin 的建议下,我尝试在控制台上运行 MSBuild,并得到了以下错误:

c:\path\to\my.csproj(74,11): error MSB4019: 未找到导入的项目“C:\Microsoft.CSharp.targets”。请确认声明中的路径是否正确,并且该文件在磁盘上存在。

第74行如下所示:

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

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

2个回答

23

今天我遇到了同样的问题,并找到了解决方法。

你的 .csproj 文件中的 BeforeBuild 目标是用来重新定义在 Microsoft.Common.targets 文件中定义(和引用)的目标,该文件被 Microsoft.CSharp.targets 文件导入,后者又被你的 .csproj 导入。

你的问题是,在你的 .csproj 文件中导入 Microsoft.CSharp.targets 的行在你定义 BeforeBuild 目标之后。把导入行移到 BeforeBuild 目标之前,一切就正常了。

希望能有所帮助,


17

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

工具->选项->项目和解决方案->生成和运行:

将MSBuild详细程度设置为“minimal”或“normal”。

此外,如果您通过控制台使用msbuild编译,则无需更改上述设置即可查看消息。


嗨,马丁。非常感谢你的回答 - 我很感激。我已经使用了最小冗余度,所以我不认为是那个问题。我尝试通过控制台编译,但出现了错误 - 我已将其附加到原始帖子中。有什么想法吗? - Steve Cooper
你是否使用过在“开始菜单->所有程序”中的“Visual Studio工具”(在Microsoft Visual Studio 20xx下)找到的Visual Studio命令提示符?它会设置一系列的环境变量,使msbuild正常工作。 - Martin Ingvar Kofoed Jensen
1
此外,您可以尝试使用“正常”而不是“最小化”。 - Martin Ingvar Kofoed Jensen
以下是详细比较,您可以在哪个详细程度下获取哪些信息:https://learn.microsoft.com/en-us/visualstudio/msbuild/obtaining-build-logs-with-msbuild?view=vs-2019 - Tobias Knauss
它可以在 Microsoft Visual Studio Enterprise 2019 版本 16.8.5 中运行。当我将 MSBuild 项目生成输出详细程度从 Minimal 设置为 Normal 时,BeforeBuild 和 AfterBuild 目标会被执行。 - Christian Storb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接