$(ProjectDir)prebuild事件宏不正确

问题描述 投票:1回答:3

我正在使用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\

这不是文档所述的内容。我怎样才能解决这个问题?

visual-studio msbuild visual-studio-2017
3个回答
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
投票

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

我无意中移动了这一行:

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

从它上面的原始位置到<PropertyGroup><PreBuildEvent> ...元素之下。

试试这个:

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

注意:我还有另一个项目开箱即用,所以我认为它也可以“刚刚发生”。


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" />
© www.soinside.com 2019 - 2024. All rights reserved.