Snapcraft linters

A linter is an analysis tool that checks for common errors or compatibility issues, usually automatically, or as part of some other process.

Snapcraft (from version 7.2 onwards) includes its own linter functionality when working with snaps using the core22 base.

Snapcraft linters run automatically when a snap is packed unless otherwise disabled.


Available linters

Snapcraft runs the following linters:

  • classic: verifies binary file parameters for snaps using classic confinement
  • library: verifies that no ELF file dependencies, such as libraries, are missing and that no extra libraries are included in the snap package

Disabling linters

Snapcraft linters run automatically when a snap is packed but specific linters can be disabled by specifying a ignore entry in the lint section of snapcraft.yaml:

lint:
  ignore:
    - classic 
    - library

The ignore entry must include one or more linter names for those linters to be disabled.

Ignore specific files

To omit specific files from a linter, add their snap location under the linter name:

lint:
  ignore:
    - classic
    - library:
      - usr/lib/**/libfoo.so*

In the above example, the classic linter will be disabled entirely, and the library linter will not run for the files matching the specified file pattern.

3 Likes

Thanks so much for adding these docs @cmatsuoka (and @mr_cal). These have all now been published:

https://snapcraft.io/docs/linters
https://snapcraft.io/docs/linters-classic
https://snapcraft.io/docs/linters-library

1 Like

I bumped into this page when searching for the review-tools snap. Maybe we can add a page about review-tools and link to it from here?

How can I advise library linter, that i will call dlopen to load a particular library - hence it is not linked in.

Looking at the source, it looks like it matches libraries against the unused-library category:

So you could add something like the following to your snapcraft.yaml:

lint:
  ignore:
    - unused-library:
      - path/to/libignored.so.1

If the shared objects are plugins and not intended to be used as libraries, the best option would be to build them without a soname.

2 Likes