我正在使用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\
这不是文档所述的内容。我该如何解决这个问题?
答案 0 :(得分:4)
对于基于SDK的项目PreBuildEvent
和PostBuildEvent
的评估太早,无法接收很多属性的“最终”值,甚至会将其视为弃用(请参阅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" />
到下方 。
尝试一下:
<PropertyGroup><PreBuildEvent> ...
(或MyProject.csproj
)。MyProject.vbproj
(或<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
)。<Import Project="$(MSBuildToolsPath)\Microsoft.VisualBasic.targets" />
)开头的正上方注意:我也有另一个项目存在此错误,因此我认为它也可能“发生”。
答案 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" />