MSBuild код ошибки 9009 при попытке опубликовать http-запрос с помощью curl

Я пытаюсь опубликовать http-запрос к "новой реликвии" с помощью кнопки "Опубликовать" в Visual Studio.

В своем профиле публикации я выбираю "веб-развертывание", а затем заканчиваю настройку. После этого я зайду в свой файл ".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 в curl.exe, она работает (сообщение завершается успешно), но не во время msbuild.

Как вы можете видеть выше, вокруг всего есть кавычки, которые принимают URL (также пробовал)

Я попытался указать путь для скручивания, как это

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

но эта работа до сих пор.

Я удалил "ItemGroup", так как я не хочу, чтобы веб-конфигурацию включали (установили для buildaction значение "none" в веб-конфигурации)

Что я могу попробовать?

обновленный

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

Это успешно выполняется, но я не вижу текст "Тест" в выводе сборки.

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

Это возвращает ошибку 9009.

Доказательство того, что его в правильном каталоге:

введите описание изображения здесь

2 ответа

Решение

При попытке воспроизвести вашу проблему я попробовал несколько вещей (запуск curl, запуск 64-битного curl, запуск, когда он находится в переменной PATH, запуск с указанием полного пути, запуск исполняемого файла из директории system32), но я не стал этого делать. Попробовать из принципа - скопировать curl в каталог system32: это практически никогда не является правильным решением проблемы по разным причинам, которые можно найти в Интернете. И да, сегодня мы нашли еще одну причину, почему это плохо:]

MSBuild-х Exec Задача работает путем создания временного файла, включая Command запустить, а затем запустить cmd.exe /q /c <path/to/tempfile>, Задача не только запускает cmd.exe, но и указывает полный путь, добавляя его Environment.GetFolderPath(Environment.SpecialFolder.System), Который возвращается C:\windows\SysWOW64 или подобное при вызове из 32-битного процесса (т.е. msbuild) в 64-битной системе.

В результате msbuild запускает 32-битный cmd из C:\windows\SysWOW64\cmd.exe, Будучи 32-битным процессом, вызывается перенаправление файловой системы: если вы указываете 32-битному процессу искать в c:\windows\system32, он не будет этого делать, а будет искать в c:\windows\SysWOW64. И curl.exe не существует, так как вы положили его в system32. И так вы получите код 9009.

Короче говоря: будьте хорошим гражданином Windows и не помещайте curl.exe в sSystem32 или SysWOW64, а затем либо укажите полный путь к нему при использовании Exec, либо добавьте каталог, в котором он находится, к вашему PATH.

curlявляется 64-битным, если вы называете это так, как это работает; %windir%\sysnative\curl

Другие вопросы по тегам