为什么我的MSBuild Exec命令失败?

时间:2014-07-23 07:17:52

标签: c# visual-studio msbuild erlang thrift

我有一个非常简单的设置,我正在使用这个应用程序进行测试:

 -Solution in VS

   -Project for cs code (named Client)

   -Project for Thrift files( named Thrift)

   -Folder for Erlang Code(Doesn't show up in VS)

我的想法是构建Thrift项目,让它生成两种语言的代码,将生成的erlang代码复制到正确的目录(使用MSBuild,但首先要做的事情),并在生成的csharp代码中包含生成的csharp代码。节俭项目。为此,我有以下“BeforeBuild”目标:

<Target Name="BeforeBuild">
<Exec Command="cmd /c &quot;C:\Windows\System32\thrift.exe&quot; -gen erl -gen csharp *.thrift" />
<ItemGroup>
  <CSFile Include="$(SolutionDir)gen-csharp\*" />
</ItemGroup>

我收到错误“'C:\ Windows \ System32 \ thrift.exe'未被识别为内部或外部命令,可运行的程序或批处理文件”。

我尝试了Command =“thrift ...”因为thrift在我的PATH中,但是发现MSBuild没有从PATH变量中找到程序。

注意:使用不带“cmd / c”的命令会导致相同的错误消息,但会出现不同的错误代码(9001,因为MSBuild无法找到该文件,而不是“cmd / c”无法找到文件)。

编辑:对于后代,工作结果为:

<Project>
...
(Auto generated data)
...

    <PropertyGroup>
  <CleanDependsOn>
      $(CleanDependsOn);
      CleanThriftGen;
  </CleanDependsOn>
  <ErlangProjectSrcDir>$(SolutionDir)Server\src\gen\</ErlangProjectSrcDir>
  <GenCSharpDir>gen-csharp\</GenCSharpDir>
  <GenErlDir>gen-erl\</GenErlDir>
  <ThriftDir>C:\thrift\</ThriftDir>
</PropertyGroup>
<Target Name="BeforeBuild">
  <Exec Command="$(ThriftDir)thrift.exe -gen erl -gen csharp *.thrift" />
</Target>
<Target Name="AfterBuild">
  <ItemGroup>
    <ErlangSrcGroup Include="$(GenErlDir)**\*.*" />
  </ItemGroup>
  <Copy SourceFiles="@(ErlangSrcGroup)" DestinationFiles="$(ErlangProjectSrcDir)%(RecursiveDir)%(Filename)%(Extension)" ContinueOnError="false" />
</Target>
<Target Name="CleanThriftGen">
 <RemoveDir Directories="$(ErlangProjectSrcDir)" />
 <RemoveDir Directories="$(GenCSharpDir)" />
 <RemoveDir Directories="$(GenErlDir)" />
</Target>
<ItemGroup>
  <CSharpGenGroup Include="$(GenCSharpDir)**\*.*" />
</ItemGroup>

1 个答案:

答案 0 :(得分:0)

找到了我的大部分答案,我急忙将可执行文件粘贴在我知道已经存在于我的路径System32中的第一个目录中。将其移动到另一个文件夹可以直接从VS(vs cmd / c)运行工具时修复错误。

但我仍然不清楚是什么导致了这一点。我不知道为什么cmd / c在具有正常权限的命令提示符时无法找到它,我不知道为什么VS找不到它。

作为测试,我给了新文件夹,我把它放在权限中,要求管理权限写入,与System32相同,但VS仍然能够从那里运行它。