Bazel Concepts: Difference between revisions

From NovaOrdis Knowledge Base
Jump to navigation Jump to search
 
(29 intermediate revisions by the same user not shown)
Line 4: Line 4:
=Repository=
=Repository=
{{External|https://bazel.build/concepts/build-ref#repositories}}
{{External|https://bazel.build/concepts/build-ref#repositories}}
 
Also see: {{Internal|Gazelle#go_repository|<tt>go_repository</tt>}}
<code>repositories.bzl</code>


=Package=
=Package=
{{External|https://bazel.build/concepts/build-ref#packages}}
{{External|https://bazel.build/concepts/build-ref#packages}}


A package is the primary unit of code organization in a repository. A package is a collection of related files, and a specification, embodied by the [[Bazel_BUILD_Files#Overview|BUILD file]], of how these files can be used to produce artifacts. The directory that contains the BUILD file is called the  <span id='Package_Directory'></span>'''package directory'''. The package contains all the files from the package directory, and recursively, from all its subdirectories, except those which themselves contain a BUILD file.
A package is the primary unit of code organization in a repository. A package is a collection of related files, and a specification, embodied by the [[Bazel_BUILD_Files#Overview|BUILD file]], of how these files can be used to produce artifacts.  
 
The directory that contains the BUILD file is called the  <span id='Package_Directory'></span>'''package directory'''. The '''package name''' is given by the name of the package directory.
 
The package contains all the files from the package directory, and recursively, from all its subdirectories, except those which themselves contain a BUILD file. From this definition, no file or directory may be a part of two different packages.
 
==<span id='BUILD_files'></span>BUILD File==
{{Internal|Bazel_BUILD_Files#Overview|Bazel BUILD Files}}
 
==Package Group==
 
A package group is a set of packages whose purpose is to limit accessibility of certain [[#Rule|rules]]. Package groups are defined by the <code>package_group</code> function. <font color=darkkhaki>TODO: https://bazel.build/concepts/build-ref#targets</font>.


=Target=
=Target=
{{External|https://bazel.build/concepts/build-ref#targets}}
{{External|https://bazel.build/concepts/build-ref#targets}}
A target is either a [[#File|file]] or a [[#Rule|rule]].
A package contains a collection of targets, defined in the package's [[Bazel_BUILD_Files#Overview|BUILD file]].
==File==
A file is a kind of [[#Target|target]]. There are two kinds of files: [[#Source_File|source files]] and [[#Generated_File|generated files]].
===Source File===
Source files are usually written by the efforts of people, and checked in to the repository.
===Generated File===
Generated files, sometimes called derived files or output files, are not checked in the repository, but are generated from [[#Source_File|source files]].
==<span id='Go_Rules'></span>Rule==
{{Internal|Bazel_BUILD_Files#Rules|<tt>BUILD</tt> Files &#124; Rules}}
=Label=
=Label=
{{External|https://bazel.build/concepts/labels}}
{{External|https://bazel.build/concepts/labels}}
=BUILD files=
{{Internal|Bazel_BUILD_Files#Overview|Bazel BUILD Files}}
=<span id='Dependency'></span>Dependencies=
=<span id='Dependency'></span>Dependencies=
{{External|https://bazel.build/concepts/dependencies}}
{{External|https://bazel.build/concepts/dependencies}}
Line 28: Line 54:
=Platforms=
=Platforms=
{{External|https://bazel.build/concepts/platforms}}
{{External|https://bazel.build/concepts/platforms}}
==Rules==
=Hermeticity=
=Hermeticity=
{{External|https://bazel.build/basics/hermeticity}}
{{External|https://bazel.build/basics/hermeticity}}
Line 36: Line 61:
{{External|https://bazel.build/concepts/build-ref#workspace}}
{{External|https://bazel.build/concepts/build-ref#workspace}}
A project's workspace is the directory where bazel looks for build inputs and <code>BUILD</code> files, and where it stores build outputs. The actual location is obtained with <code>[[Bazel_Operations#info|bazel info]]</code>.
A project's workspace is the directory where bazel looks for build inputs and <code>BUILD</code> files, and where it stores build outputs. The actual location is obtained with <code>[[Bazel_Operations#info|bazel info]]</code>.
===<tt>WORKSPACE</tt> File===
{{Internal|Bazel_WORKSPACE_File|<tt>WORKSPACE</tt> File}}


==Bin==
==Bin==
Line 93: Line 120:
</font>
</font>


==BUILD File==
==<tt>BUILD</tt> File==
{{Internal|Bazel_BUILD_Files#Overview|Bazel BUILD Files}}
{{Internal|Bazel_BUILD_Files#Overview|Bazel <tt>BUILD</tt> Files}}
==<tt>WORKSPACE</tt> File==
{{Internal|Bazel_WORKSPACE_File|<tt>WORKSPACE</tt> File}}


=Starlark=
=Starlark=
Line 112: Line 141:
<font color=darkkhaki>TODO: https://blog.bazel.build/2019/09/29/intellij-bazel-sync.html</font>
<font color=darkkhaki>TODO: https://blog.bazel.build/2019/09/29/intellij-bazel-sync.html</font>


=<tt>rules_go</tt>=
=<span id='Analyzers'></span><span id='nogo_Setup'></span><span id='nogo_Configuration'><tt>nogo</tt>=
{{External|https://github.com/bazelbuild/rules_go/}}
{{Internal|nogo|<tt>nogo</tt>}}
<font color=darkkhaki>Reconcile with [[Bazel_BUILD_Files#Build_Rules]].</font>
==<tt>nogo</tt>==
{{External|https://github.com/bazelbuild/rules_go/blob/master/go/nogo.rst#}}
<code>nogo</code> is a tool that analyzes source code of Go programs. It runs alongside the Go compiler in the Bazel Go rules and rejects programs that contain disallowing coding patterns. In addition, <code>nogo</code> may report compiler-like errors. It may be used to run the same analyses as <code>[[#vet|vet</code>]]. The <code>nogo</code> [[#nogo_Setup|rule]] will generate a program that executes all the supplied [[#Analyzers|analyzers]] at build-time. The generated <code>nogo</code> program will run alongside the compiler when building any Go target (e.g. <code>go_library</code>) within your workspace, even if the target is imported from an external repository. However, nogo will not run when targets from the current repository are imported into other workspaces and built there.
===Analyzers===
{{External|https://github.com/bazelbuild/rules_go/blob/master/go/nogo.rst#configuring-analyzers}}
===<tt>nogo</tt> Setup===
To activate <code>nogo</code>, declare a <code>nogo</code> target in the BUILD file.
<syntaxhighlight lang='go'>
load("@io_bazel_rules_go//go:def.bzl", "nogo")
 
nogo(
    name = "my_nogo",
    deps = [
        # analyzer from the local repository
        ":importunsafe",
        # analyzer from a remote repository
        "@org_golang_x_tools//go/analysis/passes/printf:go_default_library",
    ],
    visibility = ["//visibility:public"], # must have public visibility
)
go_library(
    name = "importunsafe",
    srcs = ["importunsafe.go"],
    importpath = "importunsafe",
    deps = ["@org_golang_x_tools//go/analysis:go_default_library"],
    visibility = ["//visibility:public"],
)
</syntaxhighlight>
===<tt>nogo</tt> Configuration===
{{External|https://github.com/bazelbuild/rules_go/blob/master/go/nogo.rst#configuring-analyzers}}
<code>nogo</code> is configured with a JSON file that specifies [[#Analyzer|analyzers]]:
<syntaxhighlight lang='json'>
{
  "structtag": {
    "exclude_files": {
      "vendor/": "vendor tools don't pass vet",
      "external/": "external tools don't pass vet"
    }
  },
  "exhaustive": {
    "exclude_files": {
      "vendor/": "vendor tools don't pass vet",
      "external/": "external tools don't pass vet"
    }
  },
  ...
}
</syntaxhighlight>
To exclude completely all files:
<syntaxhighlight lang='json'>
  "exhaustive": {
    "exclude_files": {
      ".*": "disable completely"
    }
  },
</syntaxhighlight>
 
=<tt>gazelle</tt>=
 
Updates Bazel configuration files.


Example:
=<span id='gazelle'></span><tt>Gazelle</tt>=
<syntaxhighlight lang='bash'>
{{Internal|Gazelle#Overview|Gazelle}}
bazel run //:gazelle -- update-repos golang.org/x/sys@v0.13.0
</syntaxhighlight>


adds the following line to the <code>WORKSPACE</code> file:
<syntaxhighlight lang='go'>
go_repository(
    name = "org_golang_x_sys",
    importpath = "golang.org/x/sys",
    sum = "h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE=",
    version = "v0.13.0",
)
</syntaxhighlight>
=<tt>vet</tt>=
=<tt>vet</tt>=
{{External|https://golang.org/cmd/vet/}}
{{External|https://golang.org/cmd/vet/}}
Also see <code>[[#nogo|nogo]]</code>.
Also see <code>[[#nogo|nogo]]</code>.

Latest revision as of 07:27, 23 November 2024

Internal

Repository

https://bazel.build/concepts/build-ref#repositories

Also see:

go_repository

Package

https://bazel.build/concepts/build-ref#packages

A package is the primary unit of code organization in a repository. A package is a collection of related files, and a specification, embodied by the BUILD file, of how these files can be used to produce artifacts.

The directory that contains the BUILD file is called the package directory. The package name is given by the name of the package directory.

The package contains all the files from the package directory, and recursively, from all its subdirectories, except those which themselves contain a BUILD file. From this definition, no file or directory may be a part of two different packages.

BUILD File

Bazel BUILD Files

Package Group

A package group is a set of packages whose purpose is to limit accessibility of certain rules. Package groups are defined by the package_group function. TODO: https://bazel.build/concepts/build-ref#targets.

Target

https://bazel.build/concepts/build-ref#targets

A target is either a file or a rule.

A package contains a collection of targets, defined in the package's BUILD file.

File

A file is a kind of target. There are two kinds of files: source files and generated files.

Source File

Source files are usually written by the efforts of people, and checked in to the repository.

Generated File

Generated files, sometimes called derived files or output files, are not checked in the repository, but are generated from source files.

Rule

BUILD Files | Rules

Label

https://bazel.build/concepts/labels

Dependencies

https://bazel.build/concepts/dependencies

Build Dependency Graph

Also see:

bazel query

Visibility

https://bazel.build/concepts/visibility

Platforms

https://bazel.build/concepts/platforms

Hermeticity

https://bazel.build/basics/hermeticity

Directories

Workspace

https://bazel.build/concepts/build-ref#workspace

A project's workspace is the directory where bazel looks for build inputs and BUILD files, and where it stores build outputs. The actual location is obtained with bazel info.

WORKSPACE File

WORKSPACE File

Bin

The actual location is obtained with bazel info.

Genfiles

The actual location is obtained with bazel info.

Testlogs

The actual location is obtained with bazel info.

Execution Root

The actual location is obtained with bazel info.

Install Base

The actual location is obtained with bazel info.

Output Base

The actual location is obtained with bazel info.

Output Path

The actual location is obtained with bazel info.

Package Path

%workspace%. See Workspace.

Repository Cache

The actual location is obtained with bazel info.

Files

Server Log

The actual location is obtained with bazel info.

Command Log

The actual location is obtained with bazel info.

.bazelrc

.bazelrc

Project View File

Seems to be this one:

directories:
 # Add the directories you want added as source here
 # By default, we've added your entire workspace ('.')
 .

# Automatically includes all relevant targets under the 'directories' above
derive_targets_from_directories: true

targets:
  # If source code isn't resolving, add additional targets that compile it here

additional_languages:
 # Uncomment any additional languages you want supported
 # android
 # dart
 # go
 # javascript
 # kotlin
 # python
 # scala
 # typescript

# Uncomment to run this target before every sync
# gazelle_target: //:gazelle

BUILD File

Bazel BUILD Files

WORKSPACE File

WORKSPACE File

Starlark

Starlark

Bazelisk

A bazel runner. as "Bazel binary location" in the Bazel IntelliJ Plugin.

Bazel and IntelliJ

Sync Process

The sync process queries Bazel for information and builds IntelliJ project structure to fid Bazel's model. It runs automatically during a project import, and manually by clicking on the sync icon in the menu bar, or partially syncing packages and individual files in contextual menus.

If the file is not reachable from Bazel targets, it will show up as unsynced in the IDE.

TODO: https://blog.bazel.build/2019/09/29/intellij-bazel-sync.html

nogo

nogo

Gazelle

Gazelle

vet

https://golang.org/cmd/vet/

Also see nogo.