提交 ac955453 编写于 作者: F Fabian Reinartz

Merge pull request #1092 from prometheus/makefile

Native go building
# Copyright 2013 Prometheus Team
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
.SUFFIXES:
include ../../Makefile.INCLUDE
all:
clean:
rm -rf *
git checkout .
*
\ No newline at end of file
*
\ No newline at end of file
......@@ -33,6 +33,7 @@ core
/promtool
benchmark.txt
/data
/.build
.#*
command-line-arguments.test
......
FROM sdurrheimer/alpine-glibc
MAINTAINER The Prometheus Authors <prometheus-developers@googlegroups.com>
WORKDIR /app
COPY . /app
WORKDIR /gopath/src/github.com/prometheus/prometheus
COPY . /gopath/src/github.com/prometheus/prometheus
RUN apk add --update -t build-deps git mercurial bzr make \
RUN apk add --update -t build-deps tar openssl git make bash \
&& source ./scripts/goenv.sh /go /gopath \
&& make build \
&& cp prometheus promtool /bin/ \
&& mkdir -p /etc/prometheus \
&& mv ./documentation/examples/prometheus.yml /etc/prometheus/prometheus.yml \
&& mv ./console_libraries/ ./consoles/ /etc/prometheus/ \
&& apk del --purge build-deps \
&& rm -rf /app /var/cache/apk/*
&& rm -rf /go /gopath /var/cache/apk/*
EXPOSE 9090
VOLUME [ "/prometheus" ]
......
# Copyright 2013 The Prometheus Authors
# Copyright 2015 The Prometheus Authors
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
......@@ -11,86 +11,33 @@
# See the License for the specific language governing permissions and
# limitations under the License.
TEST_ARTIFACTS = prometheus prometheus.race search_index
GO := GO15VENDOREXPERIMENT=1 go
pkgs = $(shell $(GO) list ./... | grep -v /vendor/)
include Makefile.INCLUDE
all: format build test
all: binary test
test:
@echo ">> running tests"
@$(GO) test -short $(pkgs)
$(GOCC): $(BUILD_PATH)/cache/$(GOPKG)
tar -C $(BUILD_PATH)/root -xzf $<
touch $@
format:
@echo ">> formatting code"
@$(GO) fmt $(pkgs)
advice: $(GOCC)
$(GO) vet ./...
vet:
@echo ">> vetting code"
@$(GO) vet $(pkgs)
binary: build
build: dependencies $(GOPATH)
$(GO) build -o prometheus $(BUILDFLAGS) github.com/prometheus/prometheus/cmd/prometheus
$(GO) build -o promtool $(BUILDFLAGS) github.com/prometheus/prometheus/cmd/promtool
build:
@echo ">> building binaries"
@./scripts/build.sh
docker:
docker build -t prometheus:$(REV) .
tarball: $(ARCHIVE)
$(GOPATH):
mkdir -p $(GOPATH)
cp -a $(MAKEFILE_DIR)/vendor/ $(GOPATH)/src
$(ARCHIVE): build
mkdir -p $(ARCHIVEDIR)
cp -a prometheus promtool consoles console_libraries $(ARCHIVEDIR)
tar -czf $(ARCHIVE) $(ARCHIVEDIR)
rm -rf $(ARCHIVEDIR)
release: REMOTE ?= $(error "can't upload, REMOTE not set")
release: REMOTE_DIR ?= $(error "can't upload, REMOTE_DIR not set")
release: $(ARCHIVE)
scp $< $(REMOTE):$(REMOTE_DIR)/
tag:
git tag $(VERSION)
git push --tags
$(BUILD_PATH)/cache/$(GOPKG):
$(CURL) -o $@ -L $(GOURL)/$(GOPKG)
benchmark: dependencies
$(GO) test $(GO_TEST_FLAGS) -test.run='NONE' -test.bench='.*' -test.benchmem ./... | tee benchmark.txt
clean:
$(MAKE) -C $(BUILD_PATH) clean
rm -rf $(TEST_ARTIFACTS)
-rm $(ARCHIVE)
-find . -type f -name '*~' -exec rm '{}' ';'
-find . -type f -name '*#' -exec rm '{}' ';'
-find . -type f -name '.#*' -exec rm '{}' ';'
$(SELFLINK): $(GOPATH)
mkdir -p `dirname $@`
ln -s $(MAKEFILE_DIR) $@
dependencies: $(GOCC) | $(SELFLINK)
documentation: search_index
godoc -http=:6060 -index -index_files='search_index'
format: dependencies
find . -iname '*.go' | egrep -v "^\./(\.build|vendor)/" | xargs -n1 $(GOFMT) -w -s=true
race_condition_binary: build
$(GO) build -race -o prometheus.race $(BUILDFLAGS) github.com/prometheus/prometheus/cmd/prometheus
$(GO) build -race -o promtool.race $(BUILDFLAGS) github.com/prometheus/prometheus/cmd/promtool
search_index:
godoc -index -write_index -index_files='search_index'
@docker build -t prometheus:$(shell git rev-parse --short HEAD) .
test: dependencies
$(GO) test $(GO_TEST_FLAGS) ./...
assets:
@$(GO) get github.com/jteeuwen/go-bindata/...
@$(GO) generate ./web/blob
web: dependencies
$(MAKE) -C web
.PHONY: advice binary build clean dependencies documentation format race_condition_binary race_condition_run release run search_index tag tarball test
.PHONY: format build test vet docker assets
# -*- Mode: makefile -*-
# Copyright 2013 The Prometheus Authors
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
.SUFFIXES:
current_dir := $(patsubst %/,%, $(dir $(abspath $(lastword $(MAKEFILE_LIST)))))
VERSION=$(shell cat $(current_dir)/version/VERSION)
OS=$(shell uname)
ARCH=$(shell uname -m)
# The release engineers apparently need to key their binary artifacts to the
# Mac OS X release family.
MAC_OS_X_VERSION ?= 10.8
MAKEFILE_DIR ?= $(realpath $(dir $(lastword $(MAKEFILE_LIST))))
BUILD_PATH = $(MAKEFILE_DIR)/.build
GO_VERSION := 1.5.1
GOOS ?= $(subst Darwin,darwin,$(subst Linux,linux,$(subst FreeBSD,freebsd,$(OS))))
# Never honor GOBIN, should it be set at all.
unexport GOBIN
GOARCH ?= $(subst x86_64,amd64,$(patsubst i%86,386,$(ARCH)))
GOPKG ?= go$(GO_VERSION).$(GOOS)-$(GOARCH)$(RELEASE_SUFFIX).tar.gz
GOURL ?= https://golang.org/dl
GOROOT = $(BUILD_PATH)/root/go
GOPATH = $(BUILD_PATH)/root/gopath
GOCC = $(GOROOT)/bin/go
TMPDIR = /tmp
GOENV = TMPDIR=$(TMPDIR) GOROOT=$(GOROOT) GOPATH=$(GOPATH)
GO = $(GOENV) $(GOCC)
GOFMT = $(GOROOT)/bin/gofmt
UNAME := $(shell uname)
REPO_PATH = github.com/prometheus/prometheus
SELFLINK = $(GOPATH)/src/$(REPO_PATH)
export PREFIX=$(BUILD_PATH)/root
export PATH := $(GOPATH)/bin:$(GOROOT)/bin:$(PATH)
export GO_TEST_FLAGS ?= -short
REV := $(shell git rev-parse --short HEAD 2> /dev/null || echo 'unknown')
BRANCH := $(shell git rev-parse --abbrev-ref HEAD 2> /dev/null || echo 'unknown')
HOSTNAME := $(shell hostname -f)
BUILD_DATE := $(shell date +%Y%m%d-%H:%M:%S)
BUILDFLAGS := -ldflags \
" -X $(REPO_PATH)/version.Version=$(VERSION)\
-X $(REPO_PATH)/version.Revision=$(REV)\
-X $(REPO_PATH)/version.Branch=$(BRANCH)\
-X $(REPO_PATH)/version.BuildUser=$(USER)@$(HOSTNAME)\
-X $(REPO_PATH)/version.BuildDate=$(BUILD_DATE)\
-X $(REPO_PATH)/version.GoVersion=$(GO_VERSION)"
CURL := curl
ARCHIVEDIR := prometheus-$(VERSION).$(GOOS)-$(GOARCH)
ARCHIVE := $(ARCHIVEDIR).tar.gz
......@@ -33,44 +33,34 @@ is the recommended way of installing Prometheus.
Debian and RPM packages are being worked on.
### Use `make`
### Building from source
Clone the repository in the usual way with `git clone`. (If you
download and unpack the source archives provided by GitHub instead of
using `git clone`, you need to set an environment variable `VERSION`
to make the below work. See
[issue #609](https://github.com/prometheus/prometheus/issues/609) for
context.)
To build Prometheus from the source code yourself you need to have a working
Go environment with [version 1.5 or greater installed](http://golang.org/doc/install).
In most circumstances, the following should work:
You can directly use the `go` tool to download and install the `prometheus`
and `promtool` binaries into your `GOPATH`:
$ make build
$ ./prometheus -config.file=documentation/examples/prometheus.yml
$ go get github.com/prometheus/prometheus/...
$ prometheus -config.file=your_config.yml
The above requires a number of common tools to be installed, namely
`curl`, `git`, `gzip`, `hg` (Mercurial CLI).
You can also clone the repository yourself and build using `make`:
Everything else will be downloaded and installed into a staging
environment in the `.build` sub-directory. That includes a Go
development environment of the appropriate version.
$ mkdir -p $GOPATH/src/github.com/prometheus
$ cd $GOPATH/src/github.com/prometheus
$ git clone https://github.com/prometheus/prometheus.git
$ cd prometheus
$ make
$ ./prometheus -config.file=your_config.yml
The `Makefile` offers a number of useful targets. Some examples:
The Makefile provides several targets:
* `make test` runs tests.
* `make tarball` creates a tarball with the binary for distribution.
* `make race_condition_run` compiles and runs a binary with the race detector enabled. To pass arguments when running Prometheus this way, set the `ARGUMENTS` environment variable (e.g. `ARGUMENTS="-config.file=./prometheus.conf" make race_condition_run`).
### Use your own Go development environment
Using your own Go development environment with the usual tooling is
possible, too. After making changes to the files in `web/static` you
have to run `make` in the `web/` directory. This generates the respective
`web/blob/files.go` file which embedds the static assets in the compiled binary.
Furthermore, the version information (see `version/info.go`) will not be
populated if you simply run `go build`. You have to pass in command
line flags as defined in `Makefile.INCLUDE` (see `${BUILDFLAGS}`) to
do that.
* *build*: build the `prometheus` and `promtool` binaries
* *test*: run the tests
* *format*: format the source code
* *vet*: check the source code for common errors
* *assets*: rebuild the static assets
* *docker*: build a docker container for the current `HEAD`
## More information
......
# Copyright 2013 Prometheus Team
#!/usr/bin/env bash
# Copyright 2015 The Prometheus Authors
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
......@@ -11,11 +13,34 @@
# See the License for the specific language governing permissions and
# limitations under the License.
.SUFFIXES:
set -e
repo_path="github.com/prometheus/prometheus"
version=$( cat version/VERSION )
revision=$( git rev-parse --short HEAD 2> /dev/null || echo 'unknown' )
branch=$( git rev-parse --abbrev-ref HEAD 2> /dev/null || echo 'unknown' )
host=$( hostname -f )
build_date=$( date +%Y%m%d-%H:%M:%S )
if [ "$(go env GOOS)" = "windows" ]; then
ext=".exe"
fi
ldflags="
-X ${repo_path}/version.Version=${version}
-X ${repo_path}/version.Revision=${revision}
-X ${repo_path}/version.Branch=${branch}
-X ${repo_path}/version.BuildUser=${USER}@${host}
-X ${repo_path}/version.BuildDate=${build_date}
-X ${repo_path}/version.GoVersion=${go_version}"
export GO15VENDOREXPERIMENT="1"
include ../Makefile.INCLUDE
echo " > prometheus"
go build -ldflags "${ldflags}" -o prometheus${ext} ${repo_path}/cmd/prometheus
all:
echo " > promtool"
go build -ldflags "${ldflags}" -o promtool${ext} ${repo_path}/cmd/promtool
clean:
$(MAKE) -C root clean
exit 0
# Copyright 2013 The Prometheus Authors
# Copyright 2015 The Prometheus Authors
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
......@@ -11,17 +11,40 @@
# See the License for the specific language governing permissions and
# limitations under the License.
include ../Makefile.INCLUDE
goroot="$1"
gopath="$2"
all: blob/files.go
go_version_min="1.5"
go_version_install="1.5.1"
SUFFIXES:
vernum() {
printf "%03d%03d%03d" $(echo "$1" | tr '.' ' ')
}
blob/files.go: go-bindata $(shell find blob/templates/ blob/static/ -type f)
$(GO) generate ./blob
$(GOFMT) -w -s=true blob/files.go
if command -v "go" >/dev/null; then
go_version=$(go version | sed -e 's/^[^0-9.]*\([0-9.]*\).*/\1/')
fi
go-bindata:
$(GO) get github.com/jteeuwen/go-bindata/...
# If we satisfy the version requirement, there is nothing to do. Otherwise
# proceed downloading and installing a go environment.
if [ $(vernum ${go_version}) -ge $(vernum ${go_version_min}) ]; then
return
fi
.PHONY: go-bindata
export GOPATH="${gopath}"
export GOROOT="${goroot}/${go_version_install}"
export PATH="$PATH:$GOROOT/bin"
if [ ! -x "${GOROOT}/bin/go" ]; then
mkdir -p "${GOROOT}"
os=$(uname | tr A-Z a-z)
arch=$(uname -m | sed -e 's/x86_64/amd64/' | sed -e 's/i.86/386/')
url="https://golang.org/dl"
tarball="go${go_version_install}.${os}-${arch}.tar.gz"
wget -qO- "${url}/${tarball}" | tar -C "${GOROOT}" --strip 1 -xz
fi
......@@ -119,7 +119,7 @@ func templates_baseHtml() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "templates/_base.html", size: 2017, mode: os.FileMode(420), modTime: time.Unix(1442039984, 0)}
info := bindataFileInfo{name: "templates/_base.html", size: 2017, mode: os.FileMode(420), modTime: time.Unix(1442334134, 0)}
a := &asset{bytes: bytes, info: info}
return a, nil
}
......@@ -976,72 +976,72 @@ type bintree struct {
}
var _bintree = &bintree{nil, map[string]*bintree{
"static": {nil, map[string]*bintree{
"css": {nil, map[string]*bintree{
"alerts.css": {staticCssAlertsCss, map[string]*bintree{}},
"graph.css": {staticCssGraphCss, map[string]*bintree{}},
"prom_console.css": {staticCssProm_consoleCss, map[string]*bintree{}},
"prometheus.css": {staticCssPrometheusCss, map[string]*bintree{}},
"static": &bintree{nil, map[string]*bintree{
"css": &bintree{nil, map[string]*bintree{
"alerts.css": &bintree{staticCssAlertsCss, map[string]*bintree{}},
"graph.css": &bintree{staticCssGraphCss, map[string]*bintree{}},
"prom_console.css": &bintree{staticCssProm_consoleCss, map[string]*bintree{}},
"prometheus.css": &bintree{staticCssPrometheusCss, map[string]*bintree{}},
}},
"img": {nil, map[string]*bintree{
"ajax-loader.gif": {staticImgAjaxLoaderGif, map[string]*bintree{}},
"img": &bintree{nil, map[string]*bintree{
"ajax-loader.gif": &bintree{staticImgAjaxLoaderGif, map[string]*bintree{}},
}},
"js": {nil, map[string]*bintree{
"alerts.js": {staticJsAlertsJs, map[string]*bintree{}},
"graph.js": {staticJsGraphJs, map[string]*bintree{}},
"graph_template.handlebar": {staticJsGraph_templateHandlebar, map[string]*bintree{}},
"prom_console.js": {staticJsProm_consoleJs, map[string]*bintree{}},
"js": &bintree{nil, map[string]*bintree{
"alerts.js": &bintree{staticJsAlertsJs, map[string]*bintree{}},
"graph.js": &bintree{staticJsGraphJs, map[string]*bintree{}},
"graph_template.handlebar": &bintree{staticJsGraph_templateHandlebar, map[string]*bintree{}},
"prom_console.js": &bintree{staticJsProm_consoleJs, map[string]*bintree{}},
}},
"vendor": {nil, map[string]*bintree{
"bootstrap-3.3.1": {nil, map[string]*bintree{
"css": {nil, map[string]*bintree{
"bootstrap-theme.css": {staticVendorBootstrap331CssBootstrapThemeCss, map[string]*bintree{}},
"bootstrap-theme.css.map": {staticVendorBootstrap331CssBootstrapThemeCssMap, map[string]*bintree{}},
"bootstrap-theme.min.css": {staticVendorBootstrap331CssBootstrapThemeMinCss, map[string]*bintree{}},
"bootstrap.css": {staticVendorBootstrap331CssBootstrapCss, map[string]*bintree{}},
"bootstrap.css.map": {staticVendorBootstrap331CssBootstrapCssMap, map[string]*bintree{}},
"bootstrap.min.css": {staticVendorBootstrap331CssBootstrapMinCss, map[string]*bintree{}},
"vendor": &bintree{nil, map[string]*bintree{
"bootstrap-3.3.1": &bintree{nil, map[string]*bintree{
"css": &bintree{nil, map[string]*bintree{
"bootstrap-theme.css": &bintree{staticVendorBootstrap331CssBootstrapThemeCss, map[string]*bintree{}},
"bootstrap-theme.css.map": &bintree{staticVendorBootstrap331CssBootstrapThemeCssMap, map[string]*bintree{}},
"bootstrap-theme.min.css": &bintree{staticVendorBootstrap331CssBootstrapThemeMinCss, map[string]*bintree{}},
"bootstrap.css": &bintree{staticVendorBootstrap331CssBootstrapCss, map[string]*bintree{}},
"bootstrap.css.map": &bintree{staticVendorBootstrap331CssBootstrapCssMap, map[string]*bintree{}},
"bootstrap.min.css": &bintree{staticVendorBootstrap331CssBootstrapMinCss, map[string]*bintree{}},
}},
"fonts": {nil, map[string]*bintree{
"glyphicons-halflings-regular.eot": {staticVendorBootstrap331FontsGlyphiconsHalflingsRegularEot, map[string]*bintree{}},
"glyphicons-halflings-regular.svg": {staticVendorBootstrap331FontsGlyphiconsHalflingsRegularSvg, map[string]*bintree{}},
"glyphicons-halflings-regular.ttf": {staticVendorBootstrap331FontsGlyphiconsHalflingsRegularTtf, map[string]*bintree{}},
"glyphicons-halflings-regular.woff": {staticVendorBootstrap331FontsGlyphiconsHalflingsRegularWoff, map[string]*bintree{}},
"fonts": &bintree{nil, map[string]*bintree{
"glyphicons-halflings-regular.eot": &bintree{staticVendorBootstrap331FontsGlyphiconsHalflingsRegularEot, map[string]*bintree{}},
"glyphicons-halflings-regular.svg": &bintree{staticVendorBootstrap331FontsGlyphiconsHalflingsRegularSvg, map[string]*bintree{}},
"glyphicons-halflings-regular.ttf": &bintree{staticVendorBootstrap331FontsGlyphiconsHalflingsRegularTtf, map[string]*bintree{}},
"glyphicons-halflings-regular.woff": &bintree{staticVendorBootstrap331FontsGlyphiconsHalflingsRegularWoff, map[string]*bintree{}},
}},
"js": {nil, map[string]*bintree{
"bootstrap.js": {staticVendorBootstrap331JsBootstrapJs, map[string]*bintree{}},
"bootstrap.min.js": {staticVendorBootstrap331JsBootstrapMinJs, map[string]*bintree{}},
"npm.js": {staticVendorBootstrap331JsNpmJs, map[string]*bintree{}},
"js": &bintree{nil, map[string]*bintree{
"bootstrap.js": &bintree{staticVendorBootstrap331JsBootstrapJs, map[string]*bintree{}},
"bootstrap.min.js": &bintree{staticVendorBootstrap331JsBootstrapMinJs, map[string]*bintree{}},
"npm.js": &bintree{staticVendorBootstrap331JsNpmJs, map[string]*bintree{}},
}},
}},
"bootstrap-datetimepicker": {nil, map[string]*bintree{
"bootstrap-datetimepicker.js": {staticVendorBootstrapDatetimepickerBootstrapDatetimepickerJs, map[string]*bintree{}},
"bootstrap-datetimepicker.min.css": {staticVendorBootstrapDatetimepickerBootstrapDatetimepickerMinCss, map[string]*bintree{}},
"bootstrap-datetimepicker": &bintree{nil, map[string]*bintree{
"bootstrap-datetimepicker.js": &bintree{staticVendorBootstrapDatetimepickerBootstrapDatetimepickerJs, map[string]*bintree{}},
"bootstrap-datetimepicker.min.css": &bintree{staticVendorBootstrapDatetimepickerBootstrapDatetimepickerMinCss, map[string]*bintree{}},
}},
"bootstrap3-typeahead": {nil, map[string]*bintree{
"bootstrap3-typeahead.min.js": {staticVendorBootstrap3TypeaheadBootstrap3TypeaheadMinJs, map[string]*bintree{}},
"bootstrap3-typeahead": &bintree{nil, map[string]*bintree{
"bootstrap3-typeahead.min.js": &bintree{staticVendorBootstrap3TypeaheadBootstrap3TypeaheadMinJs, map[string]*bintree{}},
}},
"js": {nil, map[string]*bintree{
"handlebars.js": {staticVendorJsHandlebarsJs, map[string]*bintree{}},
"jquery.hotkeys.js": {staticVendorJsJqueryHotkeysJs, map[string]*bintree{}},
"jquery.min.js": {staticVendorJsJqueryMinJs, map[string]*bintree{}},
"jquery.selection.js": {staticVendorJsJquerySelectionJs, map[string]*bintree{}},
"js": &bintree{nil, map[string]*bintree{
"handlebars.js": &bintree{staticVendorJsHandlebarsJs, map[string]*bintree{}},
"jquery.hotkeys.js": &bintree{staticVendorJsJqueryHotkeysJs, map[string]*bintree{}},
"jquery.min.js": &bintree{staticVendorJsJqueryMinJs, map[string]*bintree{}},
"jquery.selection.js": &bintree{staticVendorJsJquerySelectionJs, map[string]*bintree{}},
}},
"rickshaw": {nil, map[string]*bintree{
"rickshaw.min.css": {staticVendorRickshawRickshawMinCss, map[string]*bintree{}},
"rickshaw.min.js": {staticVendorRickshawRickshawMinJs, map[string]*bintree{}},
"vendor": {nil, map[string]*bintree{
"d3.layout.min.js": {staticVendorRickshawVendorD3LayoutMinJs, map[string]*bintree{}},
"d3.v3.js": {staticVendorRickshawVendorD3V3Js, map[string]*bintree{}},
"rickshaw": &bintree{nil, map[string]*bintree{
"rickshaw.min.css": &bintree{staticVendorRickshawRickshawMinCss, map[string]*bintree{}},
"rickshaw.min.js": &bintree{staticVendorRickshawRickshawMinJs, map[string]*bintree{}},
"vendor": &bintree{nil, map[string]*bintree{
"d3.layout.min.js": &bintree{staticVendorRickshawVendorD3LayoutMinJs, map[string]*bintree{}},
"d3.v3.js": &bintree{staticVendorRickshawVendorD3V3Js, map[string]*bintree{}},
}},
}},
}},
}},
"templates": {nil, map[string]*bintree{
"_base.html": {templates_baseHtml, map[string]*bintree{}},
"alerts.html": {templatesAlertsHtml, map[string]*bintree{}},
"graph.html": {templatesGraphHtml, map[string]*bintree{}},
"status.html": {templatesStatusHtml, map[string]*bintree{}},
"templates": &bintree{nil, map[string]*bintree{
"_base.html": &bintree{templates_baseHtml, map[string]*bintree{}},
"alerts.html": &bintree{templatesAlertsHtml, map[string]*bintree{}},
"graph.html": &bintree{templatesGraphHtml, map[string]*bintree{}},
"status.html": &bintree{templatesStatusHtml, map[string]*bintree{}},
}},
}}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册