unimport

unimport is a Go static analysis tool to find unnecessary import aliases.

Github stars Tracking Chart

unimport

unimport is a Go static analysis tool to find unnecessary import aliases.

Installation

go get -u github.com/alexkohler/unimport

Usage

Similar to other Go static anaylsis tools (such as golint, go vet) , unimport can be invoked with one or more filenames, directories, or packages named by its import path. Unimport also supports the ... wildcard.

unimport files/directories/packages

Currently, no flag are supported. A -w flag may be added in the future to automatically remove aliases where possible (Similar to gofmt's -w flag).

Purpose

As noted in Go's Code Review comments:

Avoid renaming imports except to avoid a name collision; good package names should not require renaming.
In the event of collision, prefer to rename the most local or project-specific import.

This tool will check if any import aliases are truly needed (by ensuring there is a name collision that would exist without the import alias). This tool will ignore import paths containing dashes and dots, as these are generally useful aliases while importing a specific revision. For example, in gometalinter, there are some imports like kingpin "gopkg.in/alecthomas/kingpin.v3-unstable". This is a reasonable import alias and will not be flagged.

Example

Running unimports on the Go source:

$ unimport $GOROOT/src/...
cmd/go/pkg.go:18 unnecessary import alias pathpkg
go/build/build.go:19 unnecessary import alias pathpkg
go/internal/gcimporter/gcimporter.go:23 unnecessary import alias exact
os/pipe_test.go:14 unnecessary import alias osexec
os/os_windows_test.go:10 unnecessary import alias osexec

Below are some of the arguably unneeded import aliases it found:


// go/internal/gcimporter/gcimporter.go
import (                                                                                       
    "bufio"                                                                                    
    "errors"                                                                                   
    "fmt"                                                                                      
    "go/build"                                                                                 
    "go/token"                                                                                 
    "io"                                                                                       
    "io/ioutil"                                                                                
    "os"                                                                                       
    "path/filepath"                                                                            
    "sort"                                                                                     
    "strconv"                                                                                  
    "strings"                                                                                  
    "text/scanner"                                                                             
                                                                                               
    exact "go/constant"                                                                        
    "go/types"                                                                                 
)


// os/pipe_test.go.go
import (                                                                                       
    "fmt"                                                                                      
    "internal/testenv"                                                                         
    "os"                                                                                       
    osexec "os/exec"                                                                           
    "os/signal"                                                                                
    "syscall"                                                                                  
    "testing"                                                                                  
)

TODO

  • Unit tests
  • Flagging of packages that contain an uppercase letter or underscore
  • -w flag to write changes to file where/if possible
  • Globbing support (e.g. unimport *.go)

Contributing

Pull requests welcome!

  • nakedret - Finds naked returns.
  • prealloc - Finds slice declarations that could potentially be preallocated.

Main metrics

Overview
Name With Owneralexkohler/unimport
Primary LanguageGo
Program languageGo (Language Count: 1)
Platform
License:MIT License
所有者活动
Created At2017-10-22 16:08:21
Pushed At2017-11-06 22:33:09
Last Commit At2017-11-06 17:33:08
Release Count0
用户参与
Stargazers Count69
Watchers Count3
Fork Count2
Commits Count11
Has Issues Enabled
Issues Count2
Issue Open Count1
Pull Requests Count1
Pull Requests Open Count0
Pull Requests Close Count0
项目设置
Has Wiki Enabled
Is Archived
Is Fork
Is Locked
Is Mirror
Is Private