Интересно, что линия сообщения об ошибке
C:\Program Files x86)\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets(567,2):
Содержит пространство
символ вместо открывающей скобки (
слева от x86
.
Переменная среды система PATH
не должна иметь в качестве первого пути каталога
C:\ProgramData\Oracle\Java\javapath
Это должен быть пятый путь каталога в списке каталогов.
Я не Android SDK установлен либо на одном из моих компьютеров Windows, но мне любопытно, что пути директории ANDROID_SDK_HOME
и ANDROID_SDK_HOME
определяются с окружающими двойными кавычками включены.
Это может быть правильным, но может также вызвать проблемы в зависимости от того, как эти две переменные среды ссылаются на пакетные файлы или используются в приложениях.
Пути каталогов назначаются переменным окружения, обычно без окружающих двойных кавычек.
В пакетном файле может возникнуть проблема с обработкой первого и второго аргументов.
SET projectPath=%1
SET projectName=%2
msbuild %projectPath%\%projectName% /p:Configuration=%config% /t:Clean
Если путь проекта или название проекта содержит пробел или один из этих символов &()[]{}^=;!'+,`~
они должны быть указаны заключены в двойных кавычках при запуске пакетного файла. Общепринятой практикой является передача каталогов, имен файлов и других параметров в пакетные файлы, заключенные в двойные кавычки.
Первый и второй аргументы присваиваются переменным окружения projectPath
и projectName
, как определено в командной строке при запуске командного файла, что означает без или с близкими двойными кавычками. В случае пути проекта и название проекта заключены в двойных кавычках, третья строка расширяются до выполнения, например, в:
msbuild "C:\Project Path"\"Project Name" /p:Configuration=xxx /t:Clean
Это не хорошо. Он может работать в зависимости от того, насколько хорошо исправлена ошибка интерпретатора команд Windows, соответственно, функции ядра Windows. Но было бы лучше убедиться, что двойные кавычки удаляются при назначении аргументов командного файла для переменных среды и заключают строки параметров в двойные кавычки, где это необходимо или, по крайней мере, настоятельно рекомендуется для ссылки на них в приведенных ниже командных строках.
Было бы также смысл в пакетный файл, используемый Дженкинс, чтобы избежать зависимости от переменных окружения PATH
и PATHEXT
как можно больше, особенно на управлении Дженкинс в качестве службы с системной учетной записью, указав приложения для выполнения с полным путь и расширение файла, не использующее переменные среды, или переменные системной среды, определенные самой Windows.
Вот пакетный код, написанный без Дженкинс, MSBuild, Java SDK, Java JDK или Android SDK установлен на всех с допущением, что параметр config
короткое слово никогда не содержащий критического характера.
set "projectPath=%~1"
set "projectName=%~2"
set "keystorePath=%~3"
set "password=%~4"
set "alias=%~5"
set "config=%~6"
set "apkName=%~7"
rem Get directory paths of used applications for build task.
for /D %%I in ("%ProgramFiles(x86)%\MSBuild\*") do set "MSBUILD_PATH=%%I\Bin"
for /D %%I in ("%ProgramFiles%\Java\jdk*") do set "JAVA_JDK_PATH=%%I\bin"
"%MSBUILD_PATH%\msbuild.exe" "%projectPath%\%projectName%" /p:Configuration=%config% /t:Clean
"%MSBUILD_PATH%\msbuild.exe" "%projectPath%\%projectName%" /p:Configuration=%config% /t:PackageForAndroid /p:AndroidSdkDirectory="%ProgramFiles%\Android\android-sdk"
"%JAVA_JDK_PATH%\jarsigner.exe" -verbose -sigalg MD5withRSA -digestalg SHA1 -keystore "%keystorePath%" -storepass "%password%" -signedjar "%projectPath%\bin\%config%\com.company.helloworld-signed.apk" "%projectPath%\bin\%config%\com.company.helloworld.apk" "%alias%"
"%JAVA_JDK_PATH%\zipalign.exe" -f -v 4 "%projectPath%\bin\%config%\com.company.helloworld-signed.apk" "%projectPath%\bin\%config%\%apkName%.apk"
Я не знаю, если это действительно хорошая идея, чтобы найти с пакетным файлом, MSBuild и Java JDK путь или с помощью системной переменной среды. Автоматический поиск MSBuild и Java JDK путей не может быть хорошей идеей, если иметь несколько версий MSBuild и/или Java JDK установлен.
Однако настоятельно рекомендуется назначить аргументы командного файла для переменных окружения с удалением закрытых двойных кавычек, как это сделано с помощью %~1
, %~2
, ... и позже заключить строки переменных в двойных кавычках.
В результате вывода справки в окне командной строки call /?
объясняется, какие модификаторы могут использоваться при ссылках на аргументы.
Страницы, найденные с помощью поиска WWW двигателя, связанные с этим вопросом:
тех веб-страниц 4 из топ 7 результатов на поиск с моим предпочтительным всемирным поиском в Интернете двигатель на срок "Android SDK Directory could not be found"
, заключенный в двойные кавычки, размещенный здесь, чтобы найти страницы, содержащие именно этот термин. более
Один намек:
системные переменные окружения, определенные или отредактированные пользователем с помощью панели управления Windows становятся эффективными только для приложений и служб начали после модификации.
Все уже запущенные службы, процессы и приложения уже имеют собственный набор переменных среды, созданных Windows, автоматически в память уже запущенного сервиса/процесса/приложения, полученного из родительского процесса, при запуске службы/процесса/приложения.
Невозможно, чтобы родительский процесс манипулировал переменными среды любого выполняющегося дочернего процесса, а дочерний процесс не обрабатывал переменные среды его родительского процесса.
Каждый процесс имеет свой собственный список переменных окружения, созданный Windows автоматически, как копию списка переменных окружения процесса, начинающегося с нового процесса.
Так что для служб Windows, работающих в фоновом режиме, изменение переменной системной среды требует, по крайней мере, остановки и перезапуска службы или, возможно, даже перезапуска Windows в зависимости от того, что является родительским процессом службы Windows.
Hm он нашел sdk после того, как я добавил/p: AndroidSdkDirectory, но теперь он не может найти zipalign. Почему у Дженкинса возникли проблемы с использованием моей системы PATH? –
Когда я печатаю PATH на этапе сборки, я вижу, что выглядит как правильная переменная. –
Итак, после перезагрузки компьютера он может найти zipalign и правильно построить, если я использую/p: AndroidSdkDirectory. Я все еще смущен тем, почему мне нужно использовать этот аргумент при создании из Дженкинса, но не локально. Любая помощь по-прежнему ценится. –