{"id":15705611,"url":"https://github.com/meilcli/librarian","last_synced_at":"2026-03-03T14:34:32.573Z","repository":{"id":37952575,"uuid":"250963046","full_name":"MeilCli/Librarian","owner":"MeilCli","description":"Librarian is generate notice that library used in gradle module","archived":false,"fork":false,"pushed_at":"2023-01-20T20:06:09.000Z","size":928,"stargazers_count":5,"open_issues_count":24,"forks_count":1,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-03-31T14:21:51.872Z","etag":null,"topics":["dependencies","gradle-android-plugin","gradle-plugin","license-management"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/MeilCli.png","metadata":{"files":{"readme":"README-ja.md","changelog":null,"contributing":".github/CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null}},"created_at":"2020-03-29T05:46:24.000Z","updated_at":"2023-03-05T04:11:33.000Z","dependencies_parsed_at":"2023-02-12T05:01:38.307Z","dependency_job_id":null,"html_url":"https://github.com/MeilCli/Librarian","commit_stats":null,"previous_names":[],"tags_count":50,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MeilCli%2FLibrarian","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MeilCli%2FLibrarian/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MeilCli%2FLibrarian/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MeilCli%2FLibrarian/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/MeilCli","download_url":"https://codeload.github.com/MeilCli/Librarian/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252961810,"owners_count":21832189,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dependencies","gradle-android-plugin","gradle-plugin","license-management"],"created_at":"2024-10-03T20:17:28.901Z","updated_at":"2026-03-03T14:34:32.543Z","avatar_url":"https://github.com/MeilCli.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Librarian\n![CI](https://github.com/MeilCli/Librarian/workflows/CI/badge.svg) [ ![Download](https://api.bintray.com/packages/meilcli/librarian/plugin-core/images/download.svg) ](https://bintray.com/meilcli/librarian/plugin-core/_latestVersion) [English](README.md)\n\nLibrarianはgradle moduleで使用しているライブラリーの通知を作ります\n\nLibrarianは以下の点に焦点を当てています:\n- 同一ライブラリーのアーティファクトをグループとして集計\n- 正確にライブラリーを集計する\n- 予め用意されたプリセット情報による可能な限りの自動化\n- コンフィグレーションをページとして集計し、複数の通知ファイルの作成\n\n## 目次\n- [必須](README-ja.md#必須)\n  - [Gradleのバージョンアップ](README-ja.md#Gradleのバージョンアップ)\n- [はじめに](README-ja.md#はじめに)\n  - [インストール](README-ja.md#インストール)\n  - [タスク](README-ja.md#タスク)\n  - [構成](README-ja.md#構成)\n  - [通知ページの生成](README-ja.md#通知ページの生成)\n- [Androidビューワー](README-ja.md#Androidビューワー)\n  - [ui-activityの導入](README-ja.md#ui-activityの導入)\n  - [Jsonシリアライザー](README-ja.md#Jsonシリアライザー)\n  - [サンプル](README-ja.md#サンプル)\n  - [その他](README-ja.md#その他)\n- [Viewerの作成](README-ja.md#Viewerの作成)\n- [Tips](README-ja.md#tips)\n  - [page configurationのメカニズムについて](README-ja.md#page-configurationのメカニズムについて)\n  - [Android dynamic feature moduleの依存を通知に追加する](README-ja.md#android-dynamic-feature-moduleの依存を通知に追加する)\n  - [Librarianが情報を推測できなくて通知を自動生成できない](README-ja.md#Librarianが情報を推測できなくて通知を自動生成できない)\n  - [イメージリソースライセンス通知を追加する](README-ja.md#イメージリソースライセンス通知を追加する)\n  - [pomファイルを解決できない](README.md#pomファイルを解決できない)\n- [GitHub Actions](README-ja.md#github-actions)\n  - [Auto Generate Notice Page and Create Pull Request](README-ja.md#auto-generate-notice-page-and-create-pull-request)\n- [Contributing](README.md#Contributing)\n- [License](README-ja.md#license)\n  - [Using Libraries](README-ja.md#using-libraries)\n\n## 必須\n- Gradle 5.5またはそれ以上\n- (Android開発の場合) version3.5以上のAndroid StudioとAndroid Gradle Plugin\n\n### Gradleのバージョンアップ\n1. プロジェクトのフォルダーを開く\n1. `gradle/wrapper/gradle-wrapper.properties`に移動\n1. Gradleのバージョンを挙げます\n   - たとえばこのように書き換えます:`distributionUrl=https\\://services.gradle.org/distributions/gradle-5.5.1-all.zip`\n\n## はじめに\n### インストール\nLibrarianはGitHub PackagesとBintrayに公開しているのでどちらのMaven Repositoryを参照するか選んでください\n\nBintrayの場合:\n```groovy\nbuildscript {\n    repositories {\n        maven { url \"https://dl.bintray.com/meilcli/librarian\" }\n    }\n}\n```\n\nGitHub Packagesの場合:\n```groovy\nbuildscript {\n    repositories {\n        maven {\n            url \"https://maven.pkg.github.com/MeilCli/Librarian\"\n            credentials {\n                username System.getenv(\"GITHUB_USER\")\n                password System.getenv(\"GITHUB_TOKEN\") // token has permission of read:packages\n            }\n        }\n    }\n}\n```\n\nそしてclasspathを追加してください:\n```groovy\nbuildscript {\n    dependencies {\n        classpath \"net.meilcli.librarian:plugin-core:VERSION\" // replace VERSION\n        classpath \"net.meilcli.librarian:plugin-preset:VERSION\" // replace VERSION\n    }\n}\n```\n\nそしてprojectにpluginを適用します:\n```groovy\napply plugin: 'librarian'\napply plugin: 'librarian-preset'\n```\n\n### タスク\n- librarian plugin\n  - [librarianGenerateArtifacts](Document/Task/LibrarianGenerateArtifacts.md)\n  - [librarianGenerateGroups](Document/Task/LibrarianGenerateGroups.md)\n  - [librarianGenerateBintrayGroups](Document/Task/LibrarianGenerateBintrayGroups.md)\n  - [librarianGeneratePages](Document/Task/LibrarianGeneratePages.md)\n  - [librarianGeneratePipeline](Document/Task/LibrarianGeneratePipeline.md)\n  - [librarianShowConfigurations](Document/Task/LibrarianShowConfigurations.md)\n  - [librarianShowModuleConfigurations](Document/Task/LibrarianShowModuleConfigurations.md)\n  - [librarianShowFirstDependencies](Document/Task/LibrarianShowFirstDependencies.md)\n  - [librarianShowAllDependencies](Document/Task/LibrarianShowAllDependencies.md)\n  - [librarianShowFirstConfigurationDependencies](Document/Task/LibrarianShowFirstConfigurationDependencies.md)\n  - [librarianShowAllConfigurationDependencies](Document/Task/LibrarianShowAllConfigurationDependencies.md)\n  - [librarianShowFilteredDependencyGraph](Document/Task/LibrarianShowFilteredDependencyGraph.md)\n- librarian preset plugin\n  - [librarianGeneratePresetGroups](Document/Task/LibrarianGeneratePresetGroups.md)\n  - [librarianGeneratePresetPipeline](Document/Task/LibrarianGeneratePresetPipeline.md)\n\n### 構成\n```groovy\nlibrarian {\n    dataFolderName = \"Library\" // String, default value is Library\n    depth = \"firstLevel\" // String, firstLevel or allLevel, default value is firstLevel\n    failOnGeneratePageWhenFoundPlaceholder = true // Boolean, default value is true\n    failOnOverrideUnMatchedLicense = true // Boolean, default value is true\n    failOnTooManyResolvingConfigurationLimit = 1000 // Int, default value is 1000\n    useBintray = false // Boolean, default value is false\n    ignoreArtifacts = [] // Array of String\n\n    pages {\n        \"plugin-core-usings-plugin\" { // page name, must be unique\n            title = \"Librarian plugin-core's using libraries\" // String?, default value is same the name\n            description = null // String?, default value is null\n            markdown = true // Boolean, default value is null\n            markdownFileName = \"README.md\" // String, default value is README.md\n            json = true // Boolean, default value is null\n            jsonFileName = \"notices.json\" // String, default value is notices.json\n            jsonAdditionalOutputPath = null // File, default is null\n            configurations {\n                exact {\n                    value = [\"\"] // Array of String\n                }\n                contain {\n                    value = [\"\"]\n                }\n                exact { value = [\"\"] } // exact and contain can be multiple\n            }\n            additionalNotices {\n                \"AdditionalNotice\" { // Notice name\n                    artifacts = [\"text:com\"] // Array of String, default is empty, must set value\n                    author = \"Tester\" // String, default is empty, must set value\n                    url = \"https://google.com\" // String, default is empty, must set value\n                    description = \"\" // String?, default value is null\n                    licenses {\n                        \"MIT\" { // License name, must set value\n                            url = \"https://google.com\" // String, default is empty, must set value\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    groups {\n        \"Kotlin\" { // group name, must be unique\n            artifacts = [\n                    \"org.jetbrains.kotlin:kotlin-gradle-plugin\",\n                    \"org.jetbrains.kotlin:kotlin-serialization\",\n                    \"org.jetbrains.kotlin:kotlin-stdlib-jdk7\"\n            ] // Array of String, default is empty list\n            author = null // String?, default value is null\n            url = null // String?, default value is null\n            description = null // String?, default value is null\n            licenseName = null // String?, default value is null\n            licenseUrl = null // String?, default value is null\n        }\n    }\n}\n```\n\n|path|summary|\n|:--|:--|\n|librarian.dataFolderName|出力するrootフォルダーの名前|\n|librarian.depth|依存を検索する深さ、firstLevelはあなたが直接依存したものを探します|\n|librarian.failOnGeneratePageWhenFoundPlaceholder|`librarianGeneratePages`でプレースホルダーが見つかったときに失敗します|\n|librarian.failOnOverrideUnMatchedLicense|groupのライセンス情報と一致しないオーバーライドを使用としたときに失敗します|\n|librarian.failOnTooManyResolvingConfigurationLimit|configurationの解決が多すぎる場合に失敗させる制限値、マルチモジュールプロジェクトは解決数が指数関数的に増えていきます|\n|librarian.useBintray|`librarianGenerateBintrayGroups`タスクのときにBintray APIを使ってライブラリー情報を探します、この機能はアルファ版です|\n|librarian.ignoreArtifacts|通知で無視するartifact、前方一致です|\n\n### 通知ページの生成\n1. Librarianをインストール\n1. プロジェクトで構成を書きます、`pages`ブロックを付けてください\n   - `librarianShowConfigurations`タスクを使いながら構成を書くといいでしょう\n1. `librarian.failOnGeneratePageWhenFoundPlaceholder`に`false`を設定します\n1. `librarianGeneratePresetPipeline`タスクを実行\n1. もしエラーが出たり完了しなかったら`groups`ブロックを記述して`librarianGenerateGroups`タスクを実行します\n1. `librarian.failOnGeneratePageWhenFoundPlaceholder`に`true`を設定します\n1. `librarianGeneratePresetPipeline`タスクを実行\n\n\n## Androidビューワー\n\u003cp align=\"center\"\u003e\n\u003cimg src=\"Document/Image/AndroidViewer1.png\" width=\"250\" /\u003e \u003cimg src=\"Document/Image/AndroidViewer2.png\" width=\"250\"/\u003e\n\u003c/p\u003e\n\nLibrarianはAndroidで通知を表示するためのネイティブビューワーを用意しています\n\n- `ui-core`: UIのコア実装であり、NoticesViewとNoticeViewが含まれてます\n- `ui-activity`: Activityとして表示するための`ui-core`のラップ実装です\n- `ui-fragment`: Fragmentとして表示するための`ui-core`のラップ実装です\n- `ui-serializer-**`: 様々なJson Serializer Libraryのための実装です\n\n### ui-activityの導入\ninstall UI Library:\n```groovy\ndependencies {\n    implementation \"net.meilcli.librarian:ui-activity:VERSION\" // replace VERSION\n    implementation \"net.meilcli.librarian:ui-serializer-kotlin:VERSION\" // replace VERSION and serializer\n}\n```\n\nconfigure Librarian:\n```groovy\napply plugin: 'librarian'\napply plugin: 'librarian-preset'\n\nlibrarian {\n    pages {\n        \"sample-from-maven\" {\n            title = \"Using Libraries\"\n            description = \"sample-from-maven is using this libraries.\"\n            configurations {\n                contain {\n                    value = [\n                        \"implementationDependenciesMetadata\",\n                        \"releaseImplementationDependenciesMetadata\"\n                    ]\n                }\n            }\n            jsonAdditionalOutputPath = file(\"src/main/assets/notices.json\")\n        }\n    }\n}\n```\n\nregister activity:\n```xml\n\u003capplication\u003e\n    \u003c!-- Replace your NoActionBar style --\u003e\n    \u003cactivity\n        android:name=\"net.meilcli.librarian.activities.NoticesActivity\"\n        android:theme=\"@style/AppTheme.NoActionBar\" /\u003e\n    \u003cactivity\n        android:name=\"net.meilcli.librarian.activities.NoticeActivity\"\n        android:theme=\"@style/AppTheme.NoActionBar\" /\u003e\n\u003c/application\u003e\n```\n\nregister listener:\n```kotlin\nbutton.setOnClickListener {\n    startActivity(NoticesActivity.createIntent(this, NoticesReader(), \"notices.json\"))\n}\n```\n\n### Jsonシリアライザー\n- KotlinX Serialization: `ui-serializer-kotlin`\n- Moshi: `ui-serializer-moshi`\n- Gson: `ui-serializer-gson`\n\n### サンプル\n- Using `ui-core`: [sample/sample-ui-core](sample/sample-ui-core)\n- Using `ui-activity`: [sample/sample-ui-activity](sample/sample-ui-activity)\n- Using `ui-fragment`: [sample/sample-ui-fragment](sample/sample-ui-fragment)\n- Using Dynamic Feature Module: [sample/sample-dynamic-app](sample/sample-dynamic-app)\n- Custom style: [sample/sample-ui-custom](sample/sample-ui-custom)\n\n### その他\n- [Create Own Android Serializer](Document/Viewer/CreateOwnAndroidSerializer.md)\n- [Customize Android Viewer](Document/Viewer/CustomizeAndroidViewer.md)\n\n## Viewerの作成\nSee [Create Own Viewer](Document/Viewer/CreateOwnViewer.md)\n\n## Tips\n### page configurationのメカニズムについて\nLibrarianはそれぞれのページにおいて依存を通知するconfigurationsを選ぶことができます\n\n通常ではプロジェクトはこのようなconfigurationsを持っています:\n- `implementationDependenciesMetadata`\n- `testImplementationDependenciesMetadata`\n- `classpath`\n- etc..\n\n`dependencies`ブロックの構成でこららのconfigurationsに依存が追加されます。追加された依存は`librarianShowConfigurations`タスクで確認することができます\n\n通知したいconfiguration名を`pages.configurations`ブロックに追加します。通常では`contain`ブロックを使えばいいです\n\nモジュールをネストした場合、configuration名の正確な順序を設定することができ、`librarianShowFilteredDependencyGraph`タスクではそれらの順序まで表示します\n\nexample table:\n|configurations|contain(\"releaseRuntimeClasspath\", \"apiDependenciesMetadata\")|exact(\"releaseRuntimeClasspath\", \"apiDependenciesMetadata\")|\n|:----|:--:|:--:|\n|releaseRuntimeClasspath =\u003e releaseApiDependenciesMetadata|:x:|:x:|\n|releaseRuntimeClasspath =\u003e releaseRuntimeClasspath|:o:|:x:|\n|releaseRuntimeClasspath =\u003e apiDependenciesMetadata|:o:|:o:|\n\n- `contain`: `contain`で設定した値にconfigurationsが収まっているか\n- `exact`: `exact`で設定した値と同じか\n\n### Android dynamic feature moduleの依存を通知に追加する\nAndroid dynamic feature moduleを使っている場合は通常とは違う依存グラフになります\n\ndynamic feature moduleのconfiguration名は`releaseReverseMetadataValues`(これはBuild Flavorによって異なる)といったものから始まります\n\nsee sample: [sample/sample-dynamic-app](sample/sample-dynamic-app)\n\n### Librarianが情報を推測できなくて通知を自動生成できない\nときどきLibrarianはPomファイルから情報を十分に得ることができません\n\nそういったときはLibrary groupsを使って情報を補足することができます。Library groupはもともとはartifactsを集約するための機能ですが、情報をオーバーライドするためにも使用することができるのです\n\nexample:\n```groovy\nlibrarian {\n    groups {\n        \"Kotlin\" { // group name, must be unique\n            artifacts = [\n                    \"org.jetbrains.kotlin:kotlin-gradle-plugin\",\n                    \"org.jetbrains.kotlin:kotlin-serialization\",\n                    \"org.jetbrains.kotlin:kotlin-stdlib-jdk7\"\n            ] // Array of String, default is empty list\n            author = null // String?, default value is null\n            url = null // String?, default value is null\n            description = null // String?, default value is null\n            licenseName = null // String?, default value is null\n            licenseUrl = null // String?, default value is null\n        }\n    }\n}\n```\n\nもしくは[ここ](https://github.com/MeilCli/Librarian/issues/new/choose)からプリセットをリクエストすることができます\n\n### イメージリソースライセンス通知を追加する\nたまに開発者は使用しているイメージリソースなどの通知をしなければなりません。Librarianはmaven artifactとは別に通知を追加することができます\n\nexample of Material design icons:\n```groovy\nlibrarian {\n    pages {\n        \"example\" { // page name\n            additionalNotices {\n                \"Material design icons\" { // Notice name\n                    artifacts = [\"com.google.material:icons\"] // set any value\n                    author = \"Google Inc.\"\n                    url = https://github.com/google/material-design-icons\"\n                    description = \"Material Design icons by Google\" // optional\n                    licenses {\n                        \"Apache License 2.0\" {\n                            url = \"https://github.com/google/material-design-icons/blob/master/LICENSE\"\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n```\n\n### pomファイルを解決できない\nたまにLibrarianがpomファイルを解決できない時があります。ほとんどの場合でそれはMaven Repository URLがモジュールのbuild.gradleに設定されていないことが原因です\n\nLibrarianのタスクではroot直下のbuild.gradleのbuildscriptも集計します。このとき、root直下のbuild.gradleのbuildscriptのみに設定されていると問題が起きます\n\n## GitHub Actions\nif you use GitHub Actions, recommend use GitHub Packages when CI Build\n\nswitch maven repository by environment variables:\n```groovy\nbuildscript {\n    repositories {\n        def githubUser = System.getenv(\"GITHUB_USER\")\n        def githubToken = System.getenv(\"GITHUB_TOKEN\")\n        if (githubUser != null \u0026\u0026 githubToken != null) {\n            maven {\n                url \"https://maven.pkg.github.com/MeilCli/Librarian\"\n                credentials {\n                    username githubUser\n                    password githubToken\n                }\n            }\n        } else {\n            maven { url \"https://dl.bintray.com/meilcli/librarian\" }\n        }\n    }\n}\n```\n\nset environment your workflow\n```yml\njobs:\n  build:\n    env:\n      GITHUB_USER: \"github-bot\"\n      GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n```\n\n### Auto Generate Notice Page and Create Pull Request\nusing [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request) example:\n\n```yml\nname: CI\n\non:\n  push:\n    branches:\n      - '*'\n    tags-ignore:\n      - '*'\n\njobs:\n  librarian:\n    runs-on: ubuntu-latest\n    env:\n      GITHUB_USER: \"github-bot\"\n      GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n    steps:\n      - uses: actions/checkout@v2\n      - uses: actions/setup-java@v1\n        with:\n          java-version: 1.8\n      - name: Grant permission\n        run: chmod +x gradlew\n      - run: ./gradlew librarianGeneratePresetPipeline\n      - name: Create Pull Request\n        uses: peter-evans/create-pull-request@v2\n        with:\n          commit-message: \"update library notices\"\n          title: \"update library notices\"\n```\n\n## Contributing\nsee [Contributing.md](.github/CONTRIBUTING.md). if you think to report issue, select [Issue Template](https://github.com/MeilCli/Librarian/issues/new/choose)\n\n## License\nLibrarian is MIT License\n\n### Using Libraries\nEach notices is located in the [Library](Library) folder\n|artifact name|including binary libraries|using when developing|\n|:--|:--|:--|\n|`plugin-core`|[plugin-core-usings-plugin](Library/plugin-core-usings-plugin)|[plugin-core-usings-development](Library/plugin-core-usings-development)|\n|`plugin-preset`|[plugin-preset-usings-plugin](Library/plugin-preset-usings-plugin)|[plugin-preset-usings-development](Library/plugin-preset-usings-development)|\n|`ui-core`|[ui-core-usings-library](Library/ui-core-usings-library)|[ui-core-usings-development](Library/ui-core-usings-development)|\n|`ui-activity`|[ui-activity-usings-library](Library/ui-activity-usings-library)|[ui-activity-usings-development](Library/ui-activity-usings-development)|\n|`ui-fragment`|[ui-fragment-usings-library](Library/ui-fragment-usings-library)|[ui-fragment-usings-development](Library/ui-fragment-usings-development)|\n|`ui-serializer-kotlin`|[ui-serializer-kotlin-usings-library](Library/ui-serializer-kotlin-usings-library)|[ui-serializer-kotlin-usings-development](Library/ui-serializer-kotlin-usings-development)|\n|`ui-serializer-moshi`|[ui-serializer-moshi-usings-library](Library/ui-serializer-moshi-usings-library)|[ui-serializer-moshi-usings-development](Library/ui-serializer-moshi-usings-development)|\n|`ui-serializer-gson`|[ui-serializer-gson-usings-library](Library/ui-serializer-gson-usings-library)|[ui-serializer-gson-usings-development](Library/ui-serializer-gson-usings-development)|\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmeilcli%2Flibrarian","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmeilcli%2Flibrarian","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmeilcli%2Flibrarian/lists"}