$(ProjectDir)prebuild事件宏不正确

时间:2017-04-27 11:17:09

标签: visual-studio msbuild visual-studio-2017

我正在使用Visual Studio 2017,我有一个预构建事件。

我的项目位于C:\Project\src\Project\,批量文件doSomething.bat位于C:\Project\src\Project\doSomething.bat

在我的预构建活动中,我想运行doSomething.bat,所以我有这个脚本:

cd $(ProjectDir) && call ./doSomething.bat

但是,$(ProjectDir)实际上将我置于C:\Project\src\Project\bin\Debug\netcoreapp1.1\

这不是文档所述的内容。我该如何解决这个问题?

3 个答案:

答案 0 :(得分:4)

对于基于SDK的项目PreBuildEventPostBuildEvent的评估太早,无法接收很多属性的“最终”值,甚至会将其视为弃用(请参阅https://github.com/dotnet/project-system/issues/1569

作为一种快速解决方法,您可以使用$(MSBuildProjectDirectory)$(MSBuildThisFileDirectory),它将为您提供.csproj文件所在的目录。

对于更集成的解决方案,您可以像这样向csproj文件添加自定义目标(不需要cd步骤):

<Target Name="MyAfterBuild" AfterTargets="Build">
  <Exec Command="test.bat" />
</Target>

答案 1 :(得分:1)

我是在手动编辑项目文件后发生这种情况的。

我无意中移动了这一行:

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

从它们的原始位置上方

下方

尝试一下:

  1. 打开您的项目文件,例如<PropertyGroup><PreBuildEvent> ...(或MyProject.csproj)。
  2. 找到MyProject.vbproj(或<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />)。
  3. 将其移动到构建事件元素(<Import Project="$(MSBuildToolsPath)\Microsoft.VisualBasic.targets" />)开头的正上方
  4. 清理项目/解决方案,重新编译,您应该会很好。

注意:我也有另一个项目存在此错误,因此我认为它也可能“发生”。

答案 2 :(得分:0)

关于如何正确解析常见的宏和属性有一个workaround(在线程中讨论,由@MartinUllrich提及)。

查看链接上的示例。解决方案的关键点是修改.csproj文件,以便:

  • 根标签没有属性:仅<Project>而不是<Project Sdk="Microsoft.NET.Sdk">
  • 在开头导入Sdk.props<Import Sdk="Microsoft.NET.Sdk.Web" Project="Sdk.props" />
  • 在构建前后事件之前导入Sdk.targets<Import Sdk="Microsoft.NET.Sdk.Web" Project="Sdk.targets" />