Nx plugin to use Go in a Nx workspace.
Using nx-go in your company? Consider sponsoring me and get priority support in the issues.
First, make sure you have a Nx Workspace.
Create a new one using the following command:
pnpm dlx create-nx-workspace go-playground --preset=empty --cli=nx --nx-cloud true
## Or using yarn
# yarn create nx-workspace go-playground --preset=empty --cli=nx --nx-cloud true
## Or using npm
# npm exec create-nx-workspace go-playground --preset=empty --cli=nx --nx-cloud truecd go-playgroundNext, install the nx-go plugin:
pnpm add -D @nx-go/nx-go
## Or using yarn
# yarn add -D @nx-go/nx-go
## Or using npm
# npm install -D @nx-go/nx-goCreate a new application:
nx g @nx-go/nx-go:app apinx-go includes a plugin that will build the dependency graph of go modules within your nx workspace. This is not enabled by default and must be enabled explicitly.
To enable the nx-go plugin for the dependency graph run the following command:
nx generate @nx-go/nx-go:setup-nx-go-pluginYou can now run the Nx workspace commands:
This command builds the application using the go build command, and stores the output in the dist/<app-name>/ directory.
nx build apiLint the application using the go fmt command.
nx lint apiYou can define a custom linter that will execute instead of the default go fmt.
The lint executor provides two options to configure the desired linter:
interface LintOptions {
linter: string
args: string
}linter: is the command to execute (example: revive)
args: these are additional arguments to be supplied to the linter (example: -config revive.toml)
The examples above will result in the following command that will be executed:
revive -config revive.toml ./...Serves the application using the go run command.
nx serve apiTo run the application in watch mode you can use gow, after installing it on your machine.
Open the file apps/<app-name>/project.json and in the targets.serve.options object and set the cmd parameter to gow and the cwd parameter to ., like so:
{
targets: {
serve: {
executor: '@nx-go/nx-go:serve',
options: {
cmd: 'gow', // This is the cmd that will be used
cwd: '.', // Set working dir to project root so it picks up changes in `libs/*`
main: 'apps/api/main.go',
},
},
},
}Test the application using the go test command.
nx test apiIn order to build Docker containers from the Go api inside the Nx Workspace, there are 2 base images provided:
- nxgo/base
- Node 14 on Alpine, with Go 1.13
- nxgo/cli
- Node 14 on Alpine, with Go 1.13
- @angular/cli v10
- @nrwl/cli v10
- nxpm v1
# Use nxgo/cli as the base image to do the build
FROM nxgo/cli as builder
# Create app directory
WORKDIR /workspace
# Copy package.json and the lock file
COPY package.json yarn.lock /workspace/
# Install app dependencies
RUN yarn
# Copy source files
COPY . .
# Build apps
RUN yarn build api
# This is the stage where the final production image is built
FROM golang:1.17-alpine as final
# Copy over artifacts from builder image
COPY --from=builder /workspace/dist/apps/api /workspace/api
# Set environment variables
ENV PORT=3000
ENV HOST=0.0.0.0
# Expose default port
EXPOSE 3000
# Start server
CMD [ "/workspace/api" ]Created by Bram Borggreve.