【问题标题】:MSBuild error code 9009 when trying to post a http request using curl尝试使用 curl 发布 http 请求时,MSBuild 错误代码 9009
【发布时间】:2016-05-18 02:36:51
【问题描述】:

我正在尝试使用 Visual Studio 中的“发布”按钮向“new relic”发布 http 请求。

在我的发布配置文件中,我选择“网络部署”,然后完成我的设置。之后,我将进入我的“.pubxml”文件并在底部添加一个目标:

 <Target Name="AfterBuild">
 <Exec Command="curl -H &quot;x-api-key:mykey&quot; 
 -d &quot;deployment[application_id]=appId&quot; 
 -d &quot;deployment[description]=MSbuild deploy using curl&quot; 
 -d &quot;deployment[revision]=0&quot; 
 -d &quot;deployment[changelog]=Deployed using MSBuild&quot; 
 -d &quot;deployment[user]=User&quot; 
 -d http://api.newrelic.com/deployments.xml"/>    
 </Target>
</project>

在 Visual Studio 的错误列表中,我得到以下信息:

Severity Code Description Project File Line Suppression State Error The command 
"curl 
-H "x-api-key:APPKEY" 
-d "deployment[application_id]=APPID" 
-d "deployment[description]=MSbuild deploy using curl" 
-d "deployment[revision]=1" 
-d "deployment[changelog]=Deployed using MSBuild" 
-d "deployment[user]=User" 
http://api.newrelic.com/deployments.xml" 
exited with code 9009

如果我在 curl.exe 中运行 curl 命令,它可以工作(发布成功)但在 msbuild 期间不能。

正如您在上面看到的,所有内容都带有引号,接受 url,(也尝试过)

我试过像这样指定 curl 的路径

&quot;C:\WINDOWS\system32\curl.exe&quot; 

但这并不奏效。

我已删除“ItemGroup”,因为我不希望包含 Web 配置(已在 Web 配置上将 buildaction 设置为“none”)

我可以尝试什么?

更新

<Target Name="AfterBuild"> and <Message Text="Test"/>..

这运行成功,但我在构建输出中看不到“测试”文本。

 <Target Name="AfterBuild">
 <Exec WorkingDirectory="C:\Windows\System32\" Command="curl http://www.google.com"/>

这会返回错误 9009。

证明它在正确的目录中:

【问题讨论】:

  • 我收到来自 curl.exe 的 9009 错误 你确定吗?见stackoverflow.com/questions/1351830/…
  • 您好,我更新了我的问题。是的,我已经尝试了路径修复。好吧,我不确定 curl.exe。我可以打开 cmd > 输入“curl”并按回车键 > 输入上面的代码。然后一切正常。我猜 msbuild 找不到 curl 认为它在物理路径“C:\Windows\System32\curl.exe”
  • 如果从命令中删除换行符会怎样?
  • 如果我只运行 它会被发布,但构建输出中不会显示消息“test”
  • &lt;Exec Command="C:\Windows\System32\curl http://www.google.com"/&gt; 是做什么的?

标签: xml curl msbuild pubxml


【解决方案1】:

当试图重现您的问题时,我尝试了几件事(运行 curl、运行 64 位 curl、在 PATH 中运行、指定完整路径运行、从 system32 目录运行可执行文件),但我做的一件事没有尝试将 curl 复制到 system32 目录:这样做几乎不是解决问题的正确方法,原因有很多,可以在互联网上找到。是的,今天我们发现了它不好的另一个原因:]

MsBuild 的Exec 任务通过创建一个包含Command 的临时文件来运行,然后启动cmd.exe /q /c &lt;path/to/tempfile&gt;。该任务不只是启动 cmd.exe,而是通过在其前面加上 Environment.GetFolderPath(Environment.SpecialFolder.System) 来指定完整路径。在 64 位系统上从 32 位进程(即 msbuild)调用时返回 C:\windows\SysWOW64 或类似的。

因此 msbuild 从 C:\windows\SysWOW64\cmd.exe 启动 32 位 cmd。作为一个 32 位进程,file system redirection 被调用:如果你告诉一个 32 位进程在 c:\windows\system32 中查找,它不会那样做,而是在 c:\windows\SysWOW64 中查找。并且 curl.exe 不存在,因为您将其放入 system32 中。所以你得到一个代码 9009。

长话短说:做一个好的 Windows 公民,不要将 curl.exe 放在 sSystem32 或 SysWOW64 中,然后在使用 Exec 时指定它的完整路径或将它所在的目录添加到您的 PATH。

【讨论】:

  • 你有多棒?非常感谢!
猜你喜欢
  • 1970-01-01
  • 2020-02-29
  • 1970-01-01
  • 1970-01-01
  • 2020-07-10
  • 2019-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多