MSBuild код ошибки 9009 при попытке опубликовать http-запрос с помощью curl
Я пытаюсь опубликовать http-запрос к "новой реликвии" с помощью кнопки "Опубликовать" в Visual Studio.
В своем профиле публикации я выбираю "веб-развертывание", а затем заканчиваю настройку. После этого я зайду в свой файл ".pubxml" и добавлю цель внизу:
<Target Name="AfterBuild">
<Exec Command="curl -H "x-api-key:mykey"
-d "deployment[application_id]=appId"
-d "deployment[description]=MSbuild deploy using curl"
-d "deployment[revision]=0"
-d "deployment[changelog]=Deployed using MSBuild"
-d "deployment[user]=User"
-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 (также пробовал)
Я попытался указать путь для скручивания, как это
"C:\WINDOWS\system32\curl.exe"
но эта работа до сих пор.
Я удалил "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