GCI は、Go パッケージのインポート順序を制御し、常に決定的なものにするツールです。
目的の出力形式は高度に構成可能であり、 goimport
よりも多くのカスタム形式を使用できます。
GCI は、AST に基づいてインポート ブロックを次のように考慮します。
Doc
Name Path Comment
分離されたコメント ブロックを除き、すべてのコメントは元の状態のまま保持されます。
以下のような分離されたコメント ブロック:
import (
"fmt"
// this line is isolated comment
// those lines belong to one
// isolated comment blocks
"github.com/daixiang0/gci"
)
GCI はすべてのインポート ブロックを異なるセクションに分割し、6 つのセクション タイプをサポートするようになりました。
優先順位は標準 > デフォルト > カスタム > 空白 > ドット > エイリアス > localmodule で、すべてのセクションが内部でアルファベット順にソートされます。デフォルトでは、空白、ドット、およびエイリアスのセクションは使用されず、対応する行は他のグループに入ります。
すべてのインポート ブロックは 1 つの TAB( t
) をインデントとして使用します。
v0.9.0 以降、GCI は常に C インポート ブロックを最初に置きます。
注記:
nolint
はセクション レベルで処理するのが難しいため、GCI はそれを 1 つのコメントとしてみなします。
ローカル モジュールの検出は、 gci
が呼び出されるディレクトリ内のgo.mod
ファイルからモジュール名を読み取ることによって行われます。これはつまり:
gci
がモジュール ルート (つまり、 go.mod
含むディレクトリ) から呼び出された場合に機能します。gci
がgo.work
含むディレクトリから呼び出された場合には機能しません (ただし、ワークスペース内のモジュールの 1 つから呼び出された場合は機能します)。 利用可能な最新のリリース バージョンをダウンロードしてインストールするには -
go install github.com/daixiang0/gci@latest
次のように、特定のバージョンを指定することもできます。
go install github.com/daixiang0/[email protected]
現在、GCI は主に下位互換性のために 2 つのコマンド ライン メソッドを提供しています。
GCI は 3 つの動作モードをサポートします
注記
v0.10.0 以降、
-s
および--section
フラグは複数のセクションを指定するために複数回のみ使用できます。たとえば、以前は-s standard,default
使用できましたが、現在は-s standard -s default
を使用する必要があります。この破壊的な変更により、プロジェクトで複数のカスタム プレフィックスの指定をサポートできるようになります。 (以下を参照してください。)
$ gci print -h
Print outputs the formatted file. If you want to apply the changes to a file use write instead !
Usage:
gci print path... [flags]
Aliases:
print, output
Flags:
--custom-order Enable custom order of sections
-d, --debug Enables debug output from the formatter
-h, --help help for print
-s, --section stringArray Sections define how inputs will be processed. Section names are case-insensitive and may contain parameters in (). The section order is standard > default > custom > blank > dot > alias > localmodule. The default value is [standard,default].
standard - standard section that Go provides officially, like " fmt "
Prefix(github.com/daixiang0) - custom section, groups all imports with the specified Prefix. Imports will be matched to the longest Prefix. Multiple custom prefixes may be provided, they will be rendered as distinct sections separated by newline. You can regroup multiple prefixes by separating them with comma: Prefix(github.com/daixiang0,gitlab.com/daixiang0,daixiang0)
default - default section, contains all rest imports
blank - blank section, contains all blank imports.
dot - dot section, contains all dot imports. (default [standard,default])
alias - alias section, contains all alias imports.
localmodule: localmodule section, contains all imports from local packages
--skip-generated Skip generated files
--skip-vendor Skip files inside vendor directory
$ gci write -h
Write modifies the specified files in-place
Usage:
gci write path... [flags]
Aliases:
write, overwrite
Flags:
--custom-order Enable custom order of sections
-d, --debug Enables debug output from the formatter
-h, --help help for write
-s, --section stringArray Sections define how inputs will be processed. Section names are case-insensitive and may contain parameters in (). The section order is standard > default > custom > blank > dot > alias > localmodule. The default value is [standard,default].
standard - standard section that Go provides officially, like " fmt "
Prefix(github.com/daixiang0) - custom section, groups all imports with the specified Prefix. Imports will be matched to the longest Prefix. Multiple custom prefixes may be provided, they will be rendered as distinct sections separated by newline. You can regroup multiple prefixes by separating them with comma: Prefix(github.com/daixiang0,gitlab.com/daixiang0,daixiang0)
default - default section, contains all rest imports
blank - blank section, contains all blank imports.
dot - dot section, contains all dot imports. (default [standard,default])
alias - alias section, contains all alias imports.
localmodule: localmodule section, contains all imports from local packages
--skip-generated Skip generated files
--skip-vendor Skip files inside vendor directory
$ gci list -h
Prints the filenames that need to be formatted. If you want to show the diff use diff instead, and if you want to apply the changes use write instead
Usage:
gci list path... [flags]
Flags:
--custom-order Enable custom order of sections
-d, --debug Enables debug output from the formatter
-h, --help help for list
-s, --section stringArray Sections define how inputs will be processed. Section names are case-insensitive and may contain parameters in (). The section order is standard > default > custom > blank > dot > alias > localmodule. The default value is [standard,default].
standard - standard section that Go provides officially, like " fmt "
Prefix(github.com/daixiang0) - custom section, groups all imports with the specified Prefix. Imports will be matched to the longest Prefix. Multiple custom prefixes may be provided, they will be rendered as distinct sections separated by newline. You can regroup multiple prefixes by separating them with comma: Prefix(github.com/daixiang0,gitlab.com/daixiang0,daixiang0)
default - default section, contains all rest imports
blank - blank section, contains all blank imports.
dot - dot section, contains all dot imports. (default [standard,default])
alias - alias section, contains all alias imports.
localmodule: localmodule section, contains all imports from local packages
--skip-generated Skip generated files
--skip-vendor Skip files inside vendor directory
$ gci diff -h
Diff prints a patch in the style of the diff tool that contains the required changes to the file to make it adhere to the specified formatting.
Usage:
gci diff path... [flags]
Flags:
--custom-order Enable custom order of sections
-d, --debug Enables debug output from the formatter
-h, --help help for diff
-s, --section stringArray Sections define how inputs will be processed. Section names are case-insensitive and may contain parameters in (). The section order is standard > default > custom > blank > dot > alias > localmodule. The default value is [standard,default].
standard - standard section that Go provides officially, like " fmt "
Prefix(github.com/daixiang0) - custom section, groups all imports with the specified Prefix. Imports will be matched to the longest Prefix. Multiple custom prefixes may be provided, they will be rendered as distinct sections separated by newline. You can regroup multiple prefixes by separating them with comma: Prefix(github.com/daixiang0,gitlab.com/daixiang0,daixiang0)
default - default section, contains all rest imports
blank - blank section, contains all blank imports.
dot - dot section, contains all dot imports. (default [standard,default])
alias - alias section, contains all alias imports.
localmodule: localmodule section, contains all imports from local packages
--skip-generated Skip generated files
--skip-vendor Skip files inside vendor directory
Gci enables automatic formatting of imports in a deterministic manner
If you want to integrate this as part of your CI take a look at golangci-lint.
Usage:
gci [-diff | -w rite] [--local localPackageURLs] path... [flags]
gci [command]
Available Commands:
completion Generate the autocompletion script for the specified shell
diff Prints a git style diff to STDOUT
help Help about any command
list Prints filenames that need to be formatted to STDOUT
print Outputs the formatted file to STDOUT
write Formats the specified files in-place
Flags:
-d, --diff display diffs instead of rewriting files
-h, --help help for gci
-l, --local strings put imports beginning with this string after 3rd-party packages, separate imports by comma
-v, --version version for gci
-w, --write write result to (source) file instead of stdout
Use " gci [command] --help " for more information about a command.
注記::
古いスタイルはローカル テストのみに使用され、非推奨になります。新しいスタイルを使用してくださいgolangci-lint
も新しいスタイルを使用します。
gci write -s standard -s default -s "prefix(github.com/daixiang0/gci)" main.go
実行すると、次のような場合に対処できます。
package main
import (
"golang.org/x/tools"
"fmt"
"github.com/daixiang0/gci"
)
に
package main
import (
"fmt"
"golang.org/x/tools"
"github.com/daixiang0/gci"
)
package main
import (
"fmt"
go "github.com/golang"
"github.com/daixiang0/gci"
)
に
package main
import (
"fmt"
go "github.com/golang"
"github.com/daixiang0/gci"
)
package main
import (
"fmt"
go "github.com/golang"
_ "github.com/golang/blank"
. "github.com/golang/dot"
"github.com/daixiang0/gci"
_ "github.com/daixiang0/gci/blank"
. "github.com/daixiang0/gci/dot"
)
に
package main
import (
"fmt"
go "github.com/golang"
"github.com/daixiang0/gci"
_ "github.com/daixiang0/gci/blank"
_ "github.com/golang/blank"
. "github.com/daixiang0/gci/dot"
. "github.com/golang/dot"
)
package main
import (
testing "github.com/daixiang0/test"
"fmt"
g "github.com/golang"
"github.com/daixiang0/gci"
"github.com/daixiang0/gci/subtest"
)
に
package main
import (
"fmt"
"github.com/daixiang0/gci"
"github.com/daixiang0/gci/subtest"
testing "github.com/daixiang0/test"
g "github.com/golang"
)
これがこのリポジトリのルート (つまり、 github.com/daixiang0/gci
がローカル モジュールである場合) で実行されると仮定します。
package main
import (
"os"
"github.com/daixiang0/gci/cmd/gci"
)
に
package main
import (
"os"
"github.com/daixiang0/gci/cmd/gci"
)
Name
とPath
の間には空白が 1 つだけあることを確認してくださいPath
とComment
の間には空白が 1 つだけあることを確認してくださいgoimports
使用してから GCI を使用してください)