Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio $(ProjectDir)预生成事件宏不正确_Visual Studio_Msbuild_Visual Studio 2017 - Fatal编程技术网

Visual studio $(ProjectDir)预生成事件宏不正确

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

我正在使用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
的评估太早,无法接收许多属性的“最终”值,它们甚至被视为已弃用(请参阅)

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

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


对于基于SDK的项目,
PreBuildEvent
PostBuildEvent
的评估太早,无法获得许多属性的“最终”值,它们甚至被视为不推荐使用(请参阅)

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

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


关于如何使其正确解析常见宏和属性,有一个详细的讨论(在线程中讨论,@MartinUllrich提到)

请参见链接上的示例。解决方案的要点是修改
.csproj
文件,以便:

  • 根标记没有属性:只是
    而不是
  • 开始时导入
    Sdk.props
  • 在编译前和编译后事件之前导入
    Sdk.targets
关于如何使其正确解析常见宏和属性,有一个详细的讨论(在线程中讨论,@MartinUllrich提到)

请参见链接上的示例。解决方案的要点是修改
.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>