为什么我的MSBuild执行命令失败
本文关键字:命令 失败 执行 MSBuild 我的 为什么 | 更新日期: 2023-09-27 18:14:23
我有一个非常简单的设置,我用来测试这个应用程序:
-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代码包含在Thrift项目中。要做到这一点,我有以下"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>
发现我的大部分答案,在我匆忙中,我把可执行文件放在了我知道已经在我的路径中的第一个目录System32中。移动到另一个文件夹修复了当直接从VS (VS cmd/c)运行工具时的错误。
但我仍然不清楚是什么原因造成的。我不知道为什么cmd/c无法找到它,而具有正常权限的命令提示符可以找到它,我也不知道为什么VS找不到它。
作为一个测试,我给了新的文件夹,我把它放在权限中,需要管理权限来写,和System32一样,但是VS仍然能够从那里运行它。