#android #gradle #github-package-registry
#Android #gradle #github-package-registry
Вопрос:
Я уже некоторое время использую пакеты GitHub в проекте Android без каких-либо проблем. Теперь, когда я пытаюсь опубликовать новый пакет, я получаю сообщение об ошибке:
Не удалось ПОМЕСТИТЬ полученный код состояния 422 с сервера: необработанный объект
Чтобы быть уверенным, что я ничего не изменил, я вернулся к git-тегу, из которого мне удалось успешно опубликовать пакет несколько дней назад, я изменил только версию для создания другого пакета. Я получаю ту же ошибку.
Я добавил журналы и вижу, что токен считан правильно, Все значения (ГРУППА, ВЕРСИЯ и т. Д.) Кажутся правильными и что файл, который я пытаюсь опубликовать, Находится в правильной папке. Я также пытался создать и использовать новый токен на случай, если что-то не так со старым, но это не помогло.
Отклонит ли GitHub публикацию с этой ошибкой в случае, если я опубликовал слишком много файлов? Я не нашел никакой документации об ошибке, которую вы получаете в этом случае.
Редактировать
Я также пытался создать новый проект и опубликовать его на случай, если что-то перепуталось в первоначальном, но это тоже не сработало.
Я попытался ПОМЕСТИТЬ файл напрямую, используя CURL, и это сработало, это означает, что токен указан правильно и что проблема не в ограничении общего размера опубликованных пакетов:
curl -X PUT
"https://maven.pkg.github.com/companyname/repositoryname/com/companyname/artifactid/v2.1.520/artifactid-v2.1.520.aar"
-H "Authorization: token mytoken”
--upload-file “/full/path/to/file.aar" -vvv
Конечно, это не решение, поскольку мне нужно опубликовать репозиторий maven с помощью pom и т. Д.
ЗАВЕРШЕНИЕ РЕДАКТИРОВАНИЯ
Вот моя конфигурация, которая работала долгое время и которая просто соответствует документации журналам, которые я добавил для изучения проблемы.
В build.gradle
:
allprojects {
repositories {
google()
jcenter()
maven {
name = "GitHubPackages"
url = uri("https://maven.pkg.github.com/companyname/companyname-android-sdk")
credentials {
username = project.findProperty("gpr.user") ?: System.getenv("GitHubPackagesUsername")
password = project.findProperty("gpr.key") ?: System.getenv("GitHubPackagesToken")
println "GitHubPackages build.gradlentusername=$usernamenttoken=$password"
}
}
}
}
в publish-artifacts.gradle
:
publishing {
repositories {
maven {
name = "GitHubPackages"
url = uri("https://maven.pkg.github.com/companyname/companyname-android-sdk")
credentials {
username = project.findProperty("gpr.user") ?: System.getenv("GitHubPackagesUsername")
password = project.findProperty("gpr.key") ?: System.getenv("GitHubPackagesToken")
println "GitHubPackages Publish Artifact:ntusername=$usernamenttoken=$password"
}
}
}
publications {
gpr(MavenPublication) {
println "tskSdkVersion=$SK_SDK_VERSIONntarchivesBaseName=$archivesBaseNamentGROUP=$GROUPntdesciption=$POM_DESCRIPTION"
println "artifact from $buildDir/outputs/aar/$archivesBaseName-${VARIANT_SUFFIX}.aar"
groupId SK_GROUP
version SK_SDK_VERSION
artifactId archivesBaseName
artifact "$buildDir/outputs/aar/$archivesBaseName-${VARIANT_SUFFIX}.aar"
description POM_DESCRIPTION
pom.packaging POM_PACKAGING
pom.withXml {
def dependenciesNode = asNode().appendNode('dependencies')
configurations.implementation.allDependencies.each {
println "dependency=$it"
def dependencyNode = dependenciesNode.appendNode('dependency')
dependencyNode.appendNode('groupId', it.group)
dependencyNode.appendNode('artifactId', it.name)
dependencyNode.appendNode('version', it.version)
}
}
}
}
}
в gradle.properties
файле:
POM_NAME=PackageName
POM_PACKAGING=aar
GROUP=com.companyname
POM_DESCRIPTION=CompanyName SDK Core library
VARIANT_SUFFIX
задается из переменной env.
archivesBaseName
устанавливается в модуле build.gradle
Комментарии:
1. Для чего
gpr
нужен блок?2. @IgorGanapolsky он сообщает Gradle артефакты, которые необходимо опубликовать, с их файлом pom, объявляющим зависимости и т. Д.
gpr
это просто имя. У меня есть два:gpr
иgprStaging
3. Где вы объявляете имена
gpr
иgprStaging
? Как gradle знает, как их интерпретировать.4. @IgorGanapolsky вы объявляете это с помощью этой строки. Это (ужасный?) Отличный способ скрыть то, что вы на самом деле делаете. В kotlin это было бы
create<MavenPublication>("gpr") {
. Пожалуйста, проверьте: docs.gradle.org/current/userguide/publishing_maven.html
Ответ №1:
Не могли бы вы попробовать уменьшить свой идентификатор артефакта? Я столкнулся с той же проблемой, и ее использование в нижнем регистре заставило ее работать.
Ссылка: https://github.community/t/gradle-maven-deploy-failing-with-422-unprocessable-entity/137299/3
Комментарии:
1. Похоже, Github что-то здесь изменил. Либо они разрешили символы верхнего регистра, либо они переписали их в нижний регистр. В любом случае — это исправило мою сборку релиза, которая работала 4 месяца назад, без каких-либо изменений кода на моей стороне 🙂
2. Это больше не действует. Github изменил ее. Большинство ошибок 422 при публикации в пакетах GitHub, по-видимому, связаны с тем фактом, что артефакт уже связан с другим репозиторием (см. Ответ @gridcell-coder). Если вы используете gradle или mvn для публикации, вы видите только общий «Необработанный объект 422», но если вы выполняете запрос PUT напрямую (например, с помощью Postman), вы видите полную ошибку «Пакет xxx уже связан с другим репозиторием».
3. lol, это решило проблему для меня! Спасибо 1
Ответ №2:
В моем случае, когда у артефакта было имя api
или service
или serde
он был заблокирован. например. это сработало <artifactId>database-ervice</artifactId>
, это не служба базы данных
Редактировать: при использовании Postman для выполнения запроса put я получил
Package "io.XXX.mydomain.xyz-service" is already associated with another repository.
итак, понял, что пакет был ранее отправлен в другое хранилище.
Крайне maven-deployer-plugin
плохо передает сообщение об ошибке ответа PUT, поэтому пришлось использовать mintm для поиска URL и Postman для определения сообщения.
Комментарии:
1. Кажется, нет другого способа изменить имя артефакта / группы или удалить артефакты из предыдущего репозитория. Пользователь / организация может публиковать артефакты только с одной и той же комбинацией групп-артефактов из одного репозитория.