Visual studio $(ProjectDir)预生成事件宏不正确
我正在使用Visual Studio 2017,我有一个预构建活动 我有一个项目位于Visual studio $(ProjectDir)预生成事件宏不正确,visual-studio,msbuild,visual-studio-2017,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:\Proje
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\
这不是文件中所说的。如何解决此问题?对于基于SDK的项目,
PreBuildEvent
和PostBuildEvent
的评估太早,无法接收许多属性的“最终”值,它们甚至被视为已弃用(请参阅)
作为快速解决方法,您可以使用$(MSBuildProjectDirectory)
或$(MSBuildThisFileDirectory)
,这将为您提供.csproj
文件所在的目录
对于更集成的解决方案,您可以像这样向csproj文件添加自定义目标(无需cd
步骤):
对于基于SDK的项目,
PreBuildEvent
和PostBuildEvent
的评估太早,无法获得许多属性的“最终”值,它们甚至被视为不推荐使用(请参阅)
作为快速解决方法,您可以使用$(MSBuildProjectDirectory)
或$(MSBuildThisFileDirectory)
,这将为您提供.csproj
文件所在的目录
对于更集成的解决方案,您可以像这样向csproj文件添加自定义目标(无需cd
步骤):
关于如何使其正确解析常见宏和属性,有一个详细的讨论(在线程中讨论,@MartinUllrich提到)
请参见链接上的示例。解决方案的要点是修改.csproj
文件,以便:
- 根标记没有属性:只是
而不是 - 开始时导入
:Sdk.props
- 在编译前和编译后事件之前导入
:Sdk.targets
.csproj
文件,以便:
- 根标记没有属性:只是
而不是 - 开始时导入
:Sdk.props
- 在编译前和编译后事件之前导入
:Sdk.targets
从…
元素上方的原始位置开始,移动到元素下方
试试这个:
MyProject.csproj
(或MyProject.vbproj
)
(或
)…
)注意:我还有另一个项目出现了这个开箱即用的错误,所以我认为它也可能“恰好发生”。我在手动编辑项目文件后出现了这个错误 我无意中移动了这行:
从…
元素上方的原始位置开始,移动到元素下方
试试这个:
MyProject.csproj
(或MyProject.vbproj
)
(或
)…
)注意:我还有另一个项目出现了这个开箱即用的错误,所以我认为它也可能“恰好发生”。我还发现.net核心项目中的宏“$(OutDir)”的错误,我想这个问题的原因与.net核心项目的MSBuild支持的新更改有关,使用简化的csproj项目格式,可以更轻松地手动编辑,而无需卸载项目。现在,Martin Ullrich回答中的1569号问题已经解释了这个问题的原因。他回答你的问题了吗?如果没有,请告诉我们关于这个问题的最新情况。这是一个令人难以置信的疏忽。只是一个由于任何原因都没有被修复的彻底错误。我还发现.net核心项目中的宏“$(OutDir)”不正确,我想这一问题的原因与.net核心项目的MSBuild支持的新更改有关,简化了csproj项目格式,使手工编辑更容易,无需卸载项目。现在,Martin Ullrich回答中的1569号问题已经解释了这个问题的原因。他回答你的问题了吗?如果没有,请告诉我们关于这个问题的最新情况。这是一个令人难以置信的疏忽。只是一个彻头彻尾的bug,无论什么原因都没有被修复。
<Target Name="MyAfterBuild" AfterTargets="Build">
<Exec Command="test.bat" />
</Target>