我有一个非常简单的设置,我正在使用这个应用程序进行测试:
-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 "C:\Windows\System32\thrift.exe" -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>
答案 0 :(得分:0)
找到了我的大部分答案,我急忙将可执行文件粘贴在我知道已经存在于我的路径System32中的第一个目录中。将其移动到另一个文件夹可以直接从VS(vs cmd / c)运行工具时修复错误。
但我仍然不清楚是什么导致了这一点。我不知道为什么cmd / c在具有正常权限的命令提示符时无法找到它,我不知道为什么VS找不到它。
作为测试,我给了新文件夹,我把它放在权限中,要求管理权限写入,与System32相同,但VS仍然能够从那里运行它。