我正在使用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\
这不是文档所述的内容。我怎样才能解决这个问题?
对于基于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>
我在手动编辑项目文件后发生了这种情况。
我无意中移动了这一行:
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
从它上面的原始位置到<PropertyGroup><PreBuildEvent> ...
元素之下。
试试这个:
MyProject.csproj
(或MyProject.vbproj
)。<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
(或<Import Project="$(MSBuildToolsPath)\Microsoft.VisualBasic.targets" />
)。<PropertyGroup><PreBuildEvent> ...
)注意:我还有另一个项目开箱即用,所以我认为它也可以“刚刚发生”。
关于如何正确解析常见的宏和属性,有一个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" />