☁️ Live reload for Go apps

Overview

Air Go Codacy Badge Go Report Card codecov

☁️ Live reload for Go apps

air

Motivation

When I get started with developing websites in Go and gin framework, it's a pity that gin lacks live-reloading function. In fact, I tried fresh and it seems not much flexible, so I intended to rewrite it in a better way. Finally, Air's born. In addition, great thanks to pilu, no fresh, no air :)

Air is yet another live-reloading command line utility for Go applications in development. Just air in your project root directory, leave it alone, and focus on your code.

NOTE: This tool has nothing to do with hot-deploy for production.

Features

  • Colorful log output
  • Customize build or binary command
  • Support excluding subdirectories
  • Allow watching new directories after Air started
  • Better building process

Installation

Go

The classic way to install

go get -u github.com/cosmtrek/air

macOS, Linux, Windows

# binary will be $(go env GOPATH)/bin/air
curl -sSfL https://raw.githubusercontent.com/cosmtrek/air/master/install.sh | sh -s -- -b $(go env GOPATH)/bin

# or install it into ./bin/
curl -sSfL https://raw.githubusercontent.com/cosmtrek/air/master/install.sh | sh -s

air -v

P.S. Great thanks mattn's PR for supporting Windows platform.

Docker way

Please pull this docker image cosmtrek/air.

docker run -it --rm \
    -w "<PROJECT>" \
    -e "air_wd=<PROJECT>" \
    -v $(pwd):<PROJECT> \
    -p <PORT>:<APP SERVER PORT> \
    cosmtrek/air
    -c <CONF>

For example, one of my project runs in docker:

docker run -it --rm \
    -w "/go/src/github.com/cosmtrek/hub" \
    -v $(pwd):/go/src/github.com/cosmtrek/hub \
    -p 9090:9090 \
    cosmtrek/air

Usage

For less typing, you could add alias air='~/.air' to your .bashrc or .zshrc.

First enter into your project

cd /path/to/your_project

The simplest usage is run

# firstly find `.air.toml` in current directory, if not found, use defaults
air -c .air.toml

While I prefer the second way

# 1. create a new file
touch .air.toml

# 2. paste `air_example.toml` into this file, and **modify it** to satisfy your needs.

# 3. run air with your config. If file name is `.air.toml`, just run `air`.
air

See the complete air_example.toml

Debug

air -d prints all logs.

Development

Please note that it requires Go 1.13+ since I use go mod to manage dependencies.

# 1. fork this project

# 2. clone it
mkdir -p $GOPATH/src/github.com/cosmtrek
cd $GOPATH/src/github.com/cosmtrek
git clone [email protected]:<YOUR USERNAME>/air.git

# 3. install dependencies
cd air
make ci

# 4. explore it and happy hacking!
make install

BTW: Pull requests are welcome~

Sponsor

Buy Me A Coffee

Huge thanks to the following supporters. I've always been remembering your kindness.

  • Peter Aba
  • Apostolis Anastasiou
  • keita koga

License

GNU General Public License v3.0

Issues
  • Question: Use environment variable in cmd

    Question: Use environment variable in cmd

    Is there a way to do something like:

    cmd = "go build -ldflags '-X github.com/CIDgravity/CIDgravity/backend/controller.version=${GIT_REVISION}' -o cidgravity-backend ."
    

    and use the environment variable GIT_REVISION instead of GIT_REVISION as a string?

    opened by Breigner01 16
  • Process not being killed on Windows

    Process not being killed on Windows

    Hello! First of all, thank you for this awesome package :)

    Due to Air's current implementation of starting processes on Windows (with start /b), the PID returned by cmd.Process.Pid is of a process that already exited (start's PID, not what it started), hence the debug error failed to kill PID ###, error: exit status 128 is returned.

    When trying to run the TASKKILL command manually, I noticed the following error: ERROR: The process "###" was not found., which confirms my suspicion.

    I'm thinking of a good way to fix this, since just TASKKILLing the process by name isn't a good idea.

    Is start /b even necessary? I'll try to modify the code and run some tests without it.

    If that doesn't work, maybe try to get the PID by executable path? Is that even possible? If so, just check it against c.Build.FullBin and use that on TASKKILL.

    I don't think it would be a good idea to try to parse TASKLIST as the language might change per system, etc. (also it doesn't even seem to return the executable path).. but I don't see other alternatives as listing processes in Go seems to be a nightmare..

    Suggestions?

    opened by HeCorr 16
  • Terminal text gets garbled on Windows

    Terminal text gets garbled on Windows

    Whenever running air on windows the text has issues printing.

    λ c:\Users\sonar\.air .
    
                 _
         /\     (_)
        /  \     _   _ __
       / /\ \   | | | '__|
      / ____ \  | | | |
     /_/    \_\ |_| |_|
    
    Live reload for Go apps :)
    
    [19:38:14.574] watching .
    [19:38:14.577] watching protos
    [19:38:14.579] !exclude tmp
    [19:38:14.580] building...
    [19:3[81:91:53.83:2155]. 3!2e6x]c l!uedxec ltumdpe
     tmp[
    19:38:15.329] !exclude tmp
    [19:38:15.341] running...
    

    I get this issue running in git bash as well as cmd.

    help-wanted 
    opened by SonarBeserk 16
  • Go 1.15: failed to build

    Go 1.15: failed to build

    Hello,

    We did try to update to Go 1.15 but we're having this issue starting air:

    failed to build, error: fork/exec /bin/sh: Setctty set but Ctty not valid in child

    just after building... step. We use Go 1.15 alpine docker image.

    Tested with Air v1.12.4

    Thanks

    opened by guyguy333 11
  • Process tracking can get off-by-one

    Process tracking can get off-by-one

    I've observed that sometimes air fails to kill the previous version of the process and tries to start a new one and fails. Here is a log with the debug flag on:

    make[1]: Entering directory '/app/go'
    event: "/app/go/api-server/app/auth/auth.go": CHMOD
    event: "/app/go/api-server/app/auth/auth.go": WRITE
    api-server/app/auth/auth.go has changed
    event: "/app/go/api-server/app/auth/auth.go": CHMOD
    event: "/app/go/api-server/app/auth/auth.go": WRITE
    api-server/app/auth/auth.go has changed
    flushing events
    api-server/app/auth/auth.go has changed
    make[1]: Leaving directory '/app/go'
    running...
    [GIN-debug] Listening and serving HTTP on :8080
    event: "/app/go/api-server/app/auth/auth.go": CHMOD
    event: "/app/go/api-server/app/auth/auth.go": CHMOD
    event: "/app/go/api-server/app/auth/auth.go": WRITE
    api-server/app/auth/auth.go has changed
    api-server/app/auth/auth.go has changed
    building...
    trying to kill cmd [/bin/sh -c bin/api-server]
    cmd killed, pid: 274
    make[1]: Entering directory '/app/go'
    event: "/app/go/api-server/app/auth/auth.go": CHMOD
    event: "/app/go/api-server/app/auth/auth.go": WRITE
    api-server/app/auth/auth.go has changed
    event: "/app/go/api-server/app/auth/auth.go": CHMOD
    event: "/app/go/api-server/app/auth/auth.go": WRITE
    api-server/app/auth/auth.go has changed
    flushing events
    api-server/app/auth/auth.go has changed
    building...
    make[1]: Entering directory '/app/go'
    make[1]: Leaving directory '/app/go'
    running...
    [GIN-debug] Listening and serving HTTP on :8080
    make[1]: Leaving directory '/app/go'
    running...
    [GIN-debug] Listening and serving HTTP on :8080
    [GIN-debug] [ERROR] listen tcp :8080: bind: address already in use
    
    opened by arya 11
  • Permission denied after update from 1.12.1 to 1.12.3

    Permission denied after update from 1.12.1 to 1.12.3

    Just updated air from 1.12.1 to 1.12.3. Now running air in go folder fails as follows:

      __    _   ___
     / /\  | | | |_)
    /_/--\ |_| |_| \_ v1.12.3 // live reload for Go apps, with Go1.14.0
    
    watching .
    !exclude tmp
    building...
    running...
    /bin/sh: [PATH_TO_FOLDER]/tmp/main: Permission denied
    
    opened by kasuskasus1 9
  • Hot reloading does not work when placing main.go inside cmd/ directory

    Hot reloading does not work when placing main.go inside cmd/ directory

    My project structure looks like this: image

    .air.conf

    # Config file for [Air](https://github.com/cosmtrek/air) in TOML format
    
    # Working directory
    # . or absolute path, please note that the directories following must be under root.
    root = "."
    tmp_dir = "tmp"
    
    [build]
    # Just plain old shell command. You could use `make` as well.
    cmd = "go build -o ./tmp/main ./cmd/main.go"
    # Binary file yields from `cmd`.
    bin = "tmp/main"
    # Customize binary.
    full_bin = "APP_ENV=dev APP_USER=air ./tmp/main"
    # Watch these filename extensions.
    include_ext = ["go", "tpl", "tmpl", "html"]
    # Ignore these filename extensions or directories.
    exclude_dir = ["assets", "tmp", "vendor", "frontend/node_modules"]
    # Watch these directories if you specified.
    include_dir = []
    # Exclude files.
    exclude_file = []
    # This log file places in your tmp_dir.
    log = "air.log"
    # It's not necessary to trigger build each time file changes if it's too frequent.
    delay = 1000 # ms
    # Stop running old binary when build errors occur.
    stop_on_error = true
    # Send Interrupt signal before killing process (windows does not support this feature)
    send_interrupt = false
    # Delay after sending Interrupt signal
    kill_delay = 500 # ms
    
    [log]
    # Show log time
    time = false
    
    [color]
    # Customize each part's color. If no color found, use the raw app log.
    main = "magenta"
    watcher = "cyan"
    build = "yellow"
    runner = "green"
    
    [misc]
    # Delete tmp directory on exit
    clean_on_exit = true
    
    bug 
    opened by tmwatchanan 9
  • build from multiple go files

    build from multiple go files

    Using Windows 10 Pro

    I have code in two files: main.go and handlers.go.

    When I build from the command line, no problem: go build -o ./tmp/main.exe. But when I use that same command within .air.conf, it seems it only builds main.go and ignores handlers.go, because I get the error message:

    .\main.go:14:19: undefined: firstFunc
    .\main.go:15:22: undefined: secondFunc
    

    the exact line in the config file is cmd = "go build -o ./tmp/main.exe"

    How can I run a build within air that includes all the *.go files?

    Note -- this also fails: cmd = "go build -o ./tmp/main.exe main.go handlers.go" However even if this worked, it seems like an unsatisfactory answer, eventually I may have a list of 10, 20, 50 files.

    opened by 2x2xplz 9
  • Runtime error: invalid memory address or nil pointer dereference

    Runtime error: invalid memory address or nil pointer dereference

    Constantly getting the following error after any file amend:

    panic: runtime error: invalid memory address or nil pointer dereference
    [signal SIGSEGV: segmentation violation code=0x1 addr=0x18 pc=0x4f1aa2]
    
    goroutine 23 [running]:
    github.com/cosmtrek/air/runner.(*Engine).watching.func1(0xc4200d8780, 0x4b, 0x0, 0x0, 0x553860, 0xc4200d0360, 0x0, 0x0)
            /Users/cosmtrek/Code/go/src/github.com/cosmtrek/air/runner/engine.go:100 +0x32
    path/filepath.walk(0xc420018004, 0x37, 0x5542e0, 0xc4200d3040, 0xc4200de2e0, 0x0, 0x10)
            /usr/local/opt/go/libexec/src/path/filepath/path.go:377 +0x20d
    path/filepath.Walk(0xc420018004, 0x37, 0xc4200de2e0, 0x0, 0xc42003cfc8)
            /usr/local/opt/go/libexec/src/path/filepath/path.go:403 +0x106
    github.com/cosmtrek/air/runner.(*Engine).watching(0xc4200f0000, 0xc420018004, 0x37, 0x0, 0x0)
            /Users/cosmtrek/Code/go/src/github.com/cosmtrek/air/runner/engine.go:98 +0x74
    github.com/cosmtrek/air/runner.(*Engine).watchNewDir.func1(0xc4200f0000, 0xc420018004, 0x37)
            /Users/cosmtrek/Code/go/src/github.com/cosmtrek/air/runner/engine.go:179 +0x43
    created by github.com/cosmtrek/air/runner.(*Engine).watchNewDir
            /Users/cosmtrek/Code/go/src/github.com/cosmtrek/air/runner/engine.go:178 +0x36a
    

    OS: Windows x64 and Ubuntu 16.04 LTS (Windows subsystem)

    opened by lokhman 9
  • Fix command line argument handling for slice configuration parameters

    Fix command line argument handling for slice configuration parameters

    It seems slice configuration parameters such as ExcludeDir cannot be set correctly with command line arguments (nor override default config). The test for --build.exclude_regex only passes because the test value corresponds with the default value (set in defaultConfig), it's not actually set by the parameter in the test.

    I propose to treat the command line arguments for such config parameters as comma separated strings. Setting a value would work as e.g. --build.exclude_dir "templates,build".

    opened by the 8
  • ensure multiple processes stop to avoid address already in use errors

    ensure multiple processes stop to avoid address already in use errors

    When multiple builds are started in parallel we can end up in situations where more than one process is running at once. In a web server this leads to 2022/02/21 21:23:24 listen tcp :1234: bind: address already in use and the appearance that code is not being updated and requires stopping/restarting air and potentially tracking down and killing orphaned processes in order to recover to a good state.

    This PR keeps track of each process started in a map based on PID and maintains a per process channel in order to be able to stop all previous processes when running a build, as well as when running runBin. By doing this we avoid the impacts of concurrent builds and prevent orphaned processes. This PR fixes https://github.com/cosmtrek/air/issues/216

    A further optimization of this in the future would apply a similar pattern to builds and kill in progress builds if another one kicks off.

    opened by nwadams 8
  • Support

    Support "replace" directive in go.mod with external replacement-path

    Go projects can leverage the "replace" directive in go.mod to swap an imported module for a local copy.

    Example from the gomod-ref docs:

    replace example.com/othermodule => ../othermodule
    

    This pattern is often used when you need to make an update to othermodule so you modify a local copy on disk to test your changes first in your consuming project.

    It would be an awesome developer experience if air had an option to detect replace directives in go.mod files (for external directories with a default pattern of files to watch) so a project can automatically reload.

    opened by wburningham 1
  • Bug: Adding entries to `include_dir` excludes directories

    Bug: Adding entries to `include_dir` excludes directories

    I'm working on https://github.com/soypat/upsya and am unable to use air due to this bug.

    Steps to reproduce

    My .air.toml looks like (click Details)

    root = "."
    testdata_dir = "testdata"
    tmp_dir = "tmp"
    
    [build]
      args_bin = ["-evalglob=testdata/evaluations/*/*.py"]
      bin = ";PYTHON3=python3 ./tmp/main"
      cmd = "go build -o ./tmp/main ."
      delay = 1000
      exclude_dir = ["assets", "tmp", "vendor"]
      exclude_file = []
      exclude_regex = ["_test.go"]
      exclude_unchanged = false
      follow_symlink = false
      full_bin = ""
      include_dir = []
      include_ext = ["go", "tpl", "tmpl", "html", "py"]
      kill_delay = "0s"
      log = "build-errors.log"
      send_interrupt = false
      stop_on_error = true
    
    [color]
      app = ""
      build = "yellow"
      main = "magenta"
      runner = "green"
      watcher = "cyan"
    
    [log]
      time = false
    
    [misc]
      clean_on_exit = false
    
    [screen]
      clear_on_rebuild = false
    

    air shows the following with the above config:

    watching .
    !exclude assets
    watching evaluations
    watching templates
    !exclude testdata
    !exclude tmp
    building...
    running..
    

    I change include_dir to be

      include_dir = ["testdata"]
    

    What I expected

    The same message but with watching testdata instead of excluding.

    What I saw

    Then air excludes folders which are irrelevant to the directive provided, which should be included since they contain .tmpl files

    !exclude assets
    !exclude evaluations
    !exclude templates
    !exclude testdata
    !exclude tmp
    building...
    running...
    
    opened by soypat 0
  • Air load on mac, cannot be accessed by others.

    Air load on mac, cannot be accessed by others.

    Air load a server on port, eg 8080. Cannot be accessed by others. Instead, using " go run main.go" to start the server, it can be accessed.

    I found that, it will pop up a "net work confirm" after "go run main.go" While using air, it didnot happened.

    My mac os is 12.4 version.

    opened by Lilihx 0
  • Builds with different package versions than defined in go-mod

    Builds with different package versions than defined in go-mod

    I was having an issue with plugin loading, so I tested by building my program by hand and then running it,

    the issue was that AIR was compiling my program with an different version of gorilla/mux that what my plugin was compiled in

    Both Program and Plugin utilized identical go.mod and go.sum files

    this forced me to add this to my makefile and change air's cmd in the config to make air-setup

    air-setup:
    	go build -buildmode=plugin -o workdir/modules/hello.ult.so module/example/hello.go
    	go build -o tmp/main.exe
    
    opened by Merith-TK 0
  • Space not preserved in runtime arguments

    Space not preserved in runtime arguments

    Example:

    func main() {
            greeting := flag.String("greeting", "Hello", "")
            name := flag.String("name", "World", "")
            flag.Parse()
            fmt.Println(*greeting, *name)
    }
    

    When run directly,

    ❯ ./tmp/main --name "James Bond"
    Hello James Bond
    

    When air runs it, It only prints the first name

    ❯ ~/go/bin/air           
    
      __    _   ___  
     / /\  | | | |_) 
    /_/--\ |_| |_| \_ , built with Go 
    
    watching .
    !exclude tmp
    building...
    running...
    Hello James
    ^Ccleaning...
    see you again~
    
    ❯ grep args_bin .air.toml
      args_bin = ["--name", "James Bond"]
    

    It is because the arguments are joined as string below instead which looses quoting information. https://github.com/cosmtrek/air/blob/5ac18a4db4621fecc79d2afb5a4384c2586635de/runner/engine.go#L429

    opened by balki 1
  • `include_file` option for single files

    `include_file` option for single files

    I like to exactly specify files and directories to be watched so air initializes quickly and does not iterate useless directories. This mostly works okay using the include_dir option with a list of to-watch directories, but it's not possible watch files in the root directory without adding the root directory itself.

    How about having a include_file option, where one can put single files to watch? E.g.

    [build]
    include_dir = ["modules", "libs"]
    include_file = ["main.go"]
    opened by silverwind 0
Releases(v1.40.4)
Owner
Rick Yu
Read the fucking code \ʕ◔ϖ◔ʔ/
Rick Yu
Realize is the #1 Golang Task Runner which enhance your workflow by automating the most common tasks and using the best performing Golang live reloading.

#1 Golang live reload and task runner Content - ⭐️ Top Features - ???? Get started - ?? Config sample - ?? Commands List - ?? Support and Suggestions

Oxequa 4.3k Jul 30, 2022
EGo lets you build, debug und run Go apps on Intel SGX - as simple as conventional Go programming!

EGo is a framework for building confidential apps in Go. Confidential apps run in always-encrypted and verifiable enclaves on Intel SGX-enabled ha

Edgeless Systems GmbH 321 Jul 29, 2022
Build and (re)start go web apps after saving/creating/deleting source files.

unmaintained Fresh Fresh is a command line tool that builds and (re)starts your web application everytime you save a Go or template file. If the web f

Andrea Franz 3.4k Aug 1, 2022
🔎 gowatch Live reload for go apps.

Watch ?? gowatch Live reload for go apps Motivation I had no app to live reload my Go programs. Usage Install go install github.com/gelfand/gowatch ◆

Eugene 0 Dec 29, 2021
Live reload for Go web development

livedev livedev is a development proxy server for golang that allows live reloading. It supports multiple server configuration. It uses the request's

null 80 Jun 17, 2022
Live reload utility for Go web servers

gin gin is a simple command line utility for live-reloading Go web applications. Just run gin in your app directory and your web app will be served wi

Jeremy Saenz 3.9k Aug 8, 2022
Ambiente com Docker de "live-reload" para aplicações Go

Ambiente Go Um ambiente de "live reload", onde as alterações no código são observadas e re-executadas automaticamente, com Docker e Docker Compose. O

Davi Marcondes Moreira 3 Jun 17, 2022
💨 A real time messaging system to build a scalable in-app notifications, multiplayer games, chat apps in web and mobile apps.

Beaver A Real Time Messaging Server. Beaver is a real-time messaging server. With beaver you can easily build scalable in-app notifications, realtime

Ahmed 1.4k Jul 30, 2022
Reload a specified go program automatically by monitoring a directory.

gowatcher A bash script to automatically reload a go program when .go or .html files change in the monitored directory. It uses inotify. Installation

Nick Janetakis 16 Jul 7, 2020
Reload Go code in a running process at function/method level granularity

got reload? Function/method-level stateful hot reloading for Go! Status Very much work in progress.

null 35 Apr 12, 2022
Sidecar to watch a config folder and reload a process when it changes

A small (3MB uncompressed docker image), efficient (via inotify) sidecar to trigger application reloads when configuration changes.

Florent Delannoy 21 Jul 30, 2022
A local server with real-time reload function designed for static website preview or development

中文 | English ?? 介绍 reserver 是一款为静态网站预览或开发设计的具有实时重新加载功能的本地服务器。 其主要运用场景为: 单页应用的预览(例如Vue编译之后的项目不可以直接通过file://协议进行访问) 具有ajax请求的页面(因浏览器安全限制,默认禁止file://协议进行

憧憬Licoy 6 Nov 27, 2021
GCP Cloud Functions ready to Go starter with hot reload 🔥

GCP Cloud Functions - Go Starter Features: funcFramework already set up - ready for local development and testing. Hot Reload ready-to-go thanks to th

Eric Crescioni 0 Dec 16, 2021
Golang http&grpc server for gracefully shutdown like nginx -s reload

supervisor Golang http & grpc server for gracefully shutdown like nginx -s reload if you want a server which would be restarted without stopping servi

Terry Fei 0 Jan 8, 2022
This is a hot reload tooling for go

hotpocket This is a hot reload tooling for go Usage First need to have a json file in the root of your project. Name it as a hotpocket.json. It Should

Rasulov Emirlan 4 Jul 17, 2022
Realize is the #1 Golang Task Runner which enhance your workflow by automating the most common tasks and using the best performing Golang live reloading.

#1 Golang live reload and task runner Content - ⭐️ Top Features - ???? Get started - ?? Config sample - ?? Commands List - ?? Support and Suggestions

Oxequa 4.3k Jul 30, 2022
Server-sent live updates: protocol and reference implementation

Protocol and Reference Implementation Mercure is a protocol allowing to push data updates to web browsers and other HTTP clients in a convenient, fast

Kévin Dunglas 2.9k Aug 5, 2022
:rocket: Instant live visualization of your Go application runtime statistics (GC, MemStats, etc.) in the browser

Statsviz Instant live visualization of your Go application runtime statistics (GC, MemStats, etc.). Import "github.com/arl/statsviz" Register statsviz

Aurélien Rainone 1.9k Aug 6, 2022
Parse and generate m3u8 playlists for Apple HTTP Live Streaming (HLS) in Golang (ported from gem https://github.com/sethdeckard/m3u8)

go-m3u8 Golang package for m3u8 (ported m3u8 gem https://github.com/sethdeckard/m3u8) go-m3u8 provides easy generation and parsing of m3u8 playlists d

Tan Quang Ngo 97 Jul 24, 2022
A live-updating version of the UNIX wc command.

lwc A live-updating version of the UNIX wc command. Installation You can get a prebuilt binary for every major platform from the Releases page. Just e

Tim De Pauw 27 Jul 26, 2022
Live on-demand transcoding in go using ffmpeg. Also with NVIDIA GPU hardware acceleration.

Go live HTTP on-demand transcoding Transcoding is expensive and resource consuming operation on CPU and GPU. For big companies with thousands of custo

Miroslav Šedivý 93 Jul 22, 2022
Terminal stock ticker with live updates and position tracking

Ticker Terminal stock watcher and stock position tracker Features Live stock price quotes Track value of your stock positions Support for multiple cos

Ani Channarasappa 4.3k Aug 2, 2022
Pi-hole data right from your terminal. Live updating view, query history extraction and more!

Pi-CLI Pi-CLI is a command line program used to view data from a Pi-Hole instance directly in your terminal.

Reece Mercer 41 Apr 26, 2022
Live coding a basic Go compiler with LLVM in 20 minutes

go2ll-talk The code presented at Sheffield Go, 7th March. Slides link To run, just say make. To take a look at the output of the program, run go run .

Peter Waller 265 Jul 2, 2022
Self hosted live chat server written in Go

goch is a self-hosted live-chat server written in Go. It allows you to run a live-chat software on your own infrastructure. You can create multip

Emir Ribić 160 Jul 6, 2022
🔥 Golang live stream lib/client/server. support RTMP/RTSP/HLS/HTTP[S]-FLV/HTTP-TS, H264/H265/AAC, relay, cluster, record, HTTP API/Notify, GOP cache. 官方文档见 https://pengrl.com/lal

lal是一个开源GoLang直播流媒体网络传输项目,包含三个主要组成部分: lalserver:流媒体转发服务器。类似于nginx-rtmp-module等应用,但支持更多的协议,提供更丰富的功能。lalserver简介 demo:一些小应用,比如推、拉流客户端,压测工具,流分析工具,调度示例程序等

yoko 1.6k Aug 2, 2022
Realize is the #1 Golang Task Runner which enhance your workflow by automating the most common tasks and using the best performing Golang live reloading.

#1 Golang live reload and task runner Content - ⭐️ Top Features - ???? Get started - ?? Config sample - ?? Commands List - ?? Support and Suggestions

Oxequa 4.3k Aug 2, 2022