• Stars
    star
    234
  • Rank 165,404 (Top 4 %)
  • Language
    Go
  • License
    MIT License
  • Created over 9 years ago
  • Updated almost 9 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Vendor Go dependencies

nut

Gophers love nuts.

nut

nut is a tool that allows Go projects to declare dependencies, download dependencies, rewrite import paths and ensure that dependencies are properly vendored.

To accomplish this goal, nut does three things:

  • Introduces a metadata file with dependency information.
  • Fetches your project's dependencies and rewrite their import paths.
  • Introduces conventions for managing vendored dependencies.

nut is specifically designed to manage dependencies for a binary program. If you are making a library, please follow the standard Go way.

Voting for nut

I made nut as part of the Gopher Gala contest. If you like what you see, please vote for it.

Installation

Make sure you have a working Go environment. See the install instructions.

To install nut, simply run:

$ go get github.com/jingweno/nut

Make sure your PATH includes to the $GOPATH/bin directory so your commands can be easily used:

export PATH=$PATH:$GOPATH/bin

Creating A New Project

Inside your GOPATH, run:

$ nut new hello_world

Let's checkout what nut has generated for us:

$ cd hello_world
$ tree .
.
โ”œโ”€โ”€ .gitignore
โ”œโ”€โ”€ Nut.toml
โ”œโ”€โ”€ README.md
โ””โ”€โ”€ main.go

0 directories, 4 files

First let's check out Nut.toml:

[application]

name = "hello_world"
version = "0.0.1"
authors = ["Your Name <[email protected]>"]

This piece of application information is reserved for future usage.

Adding a dependency

It's quite simple to add a dependency. Simply add it to your Nut.toml file:

[dependencies]

"github.com/octokit/go-octokit/octokit" = ""
"github.com/fhs/go-netrc/netrc" = "4422b68c9c"

The format of declaring a dependency is PACKAGE = COMMIT-ISH. PACKAGE is a valid package path that passes into go get. COMMIT-ISH can be any tag, sha or branch. An empty COMMIT-ISH means the latest version of the dependency.

Downloading dependencies

Run nut install to download dependencies. nut puts dependencies to vendor/_nuts/. Let's take a look this folder:

$ tree vendor
vendor
โ””โ”€โ”€ _nuts
    โ””โ”€โ”€ github.com
        โ”œโ”€โ”€ fhs
        โ”‚ย ย  โ””โ”€โ”€ go-netrc
        โ”‚ย ย      ...
        โ””โ”€โ”€ octokit
            โ””โ”€โ”€ go-octokit
                ...

20 directories, 98 files

The import paths of all dependencies are rewritten to be relative to vendor/_nuts. For example, assuming github.com/octokit/go-octokit depends on github.com/sawyer/go-sawyer, all the import paths of go-octokit to go-sawyer will be relative to vendor/_nuts since they're vendored.

Importing a dependency

To import a dependency, refer to it by its full import path:

package main

import (
  "github.com/jingweno/hello_world/vendor/_nuts/github.com/octokit/go-octokit/octokit"
)

func main() {
    c := octokit.NewClient()
    ...
}

Building

All dependencies are properly vendored to vendor/_nuts and your program is referring to import paths relative to this folder. go build and go test should just work.

Demo

demo

FAQ

What makes nut different than other dependency management tools?

nut allows you to lock dependencies, vendor them and rewrite their import paths. The dependencies vendored by nut are "self contained" and are ready for use without overriding GOPATH. Most existing dependency management tools in Go override GOPATH and you need an extra tool to build your project. With nut, you can build your project with just go build. nut properly vendors dependencies so that existing go commands work as a standard Go project.

Is nut the same as godep save -r?

godep allow rewriting the import paths of dependencies with godep save -r. nut does exactly the same thing in this regard. However, godep doesn't allow updating any dependency with rewritten import paths. nut doesn't currently support update of dependencies but it's a high priority item that will be implemented next. The workflow will be as straightforward as nut update FOO to update an individual dependency specified in Nut.toml.

Besides, nut's design philosophy is very different from godep: nut is explicit about dependency management with a manifest file (Nut.toml) and allows locking of dependencies, whereas godep isn't.

Who is using nut?

Other arts

More Repositories

1

ccat

Colorizing `cat`
Go
3,105
star
2

godzilla

Godzilla is a ES2015 to Go source code transpiler and runtime
Go
1,482
star
3

hacker-menu

Hacker News Delivered to Desktop ๐Ÿ‘ฏ
JavaScript
1,004
star
4

upterm

Instant Terminal Sharing
Go
769
star
5

gh

Fast GitHub command line client (deprecated). gh has been merged into https://github.com/github/hub, see https://github.com/github/hub/issues/475 for more info
Go
717
star
6

jqplay

A playground for jq, written in Go
Go
697
star
7

thunderbird

โšก๐Ÿฆ Elegant WebSockets in Go
JavaScript
511
star
8

goup

Elegant Go installer
Go
478
star
9

spotctl

A command-line interface to Spotify, written in Go
Go
242
star
10

gotask

Idiomatic build tool in Go
Go
177
star
11

jekyll_and_hyde

A HTML presentation generator that generates a basic Jekyll scaffold with Slippy hooking up.
Ruby
174
star
12

candy

Candy is a zero-config reverse proxy server
Go
119
star
13

devise_uid

Add UID support to Devise.
Ruby
61
star
14

gaffer

Gaffer - Foreman on JVM
Java
56
star
15

msgpack_rails

MessagePack for Rails / msgpack.org[Rails]
Ruby
45
star
16

conf

Configuration loader in Go
Go
31
star
17

negroni-gorelic

negroni_gorelic is NewRelic middleware for negroni framework.
Go
27
star
18

gundam

The most destructive robot
Go
18
star
19

sql_parser

A Ruby SQL parser based on Treetop.
Ruby
18
star
20

vimux-zeus

vimux and zeus in action.
Vim Script
14
star
21

go-get-nuts

HTML5 Game built with Phaser
JavaScript
10
star
22

heroic_haiku

A simple game that is written in Flutter and Flame.
Dart
10
star
23

heroku-buildpack-wasmer

Heroku Buildpack for Wasmer
Shell
8
star
24

osh

The O shell
Go
8
star
25

jruby_sinatra_activerecord

A template app to run JRuby with Sinatra and ActiveRecord
Ruby
7
star
26

travisarchive

Travis Archive
Go
7
star
27

blog

My blog
JavaScript
6
star
28

dotfiles_old

My dotfiles
Shell
6
star
29

git-rebase-merge

A bash script to rebase and merge a Git topic branch to current branch.
Shell
5
star
30

message_queue

A common interface to multiple message queues libraries.
Ruby
4
star
31

homebrew-ccat

Homebrew fomular for `ccat` (deprecated), use `brew install ccat` instead
Ruby
4
star
32

eventloopclass

Go version of the exercises for The Truth About Event Loop Online Masterclass
Go
4
star
33

codeface

Run web-based VS Code on Heroku
Go
3
star
34

cheatsheets

3
star
35

codefaces

a web-based source control client
Java
3
star
36

patching_with_class_shadowing_and_maven

Using Maven to help with class shadowing.
Java
3
star
37

dotfiles

My dotfiles
Shell
3
star
38

hdp

HTTP Debug Proxy (HDP) logs HTTP requests for inspection.
Go
3
star
39

com.google.dart.compiler

A Dart compiler implemented in Java extracted from Dart's official repository.
Java
3
star
40

maven_jetty_plugin_example

Speed Up J2EE Environment Setup With Jetty Maven Plugin Example
Java
2
star
41

.dotfiles

dotfiles for my Mac
Ruby
2
star
42

priority_test

Run tests in priority order.
Ruby
2
star
43

mag

MAG - Full-Stack application development using MongoDB, AngularJS, and Go
2
star
44

ruby_grep

Module to search file(s) for lines that match a given pattern.
Ruby
2
star
45

rbfmt

Format Ruby code
Ruby
2
star
46

tic_tac_toe_engine

A dead simple Tic Tac Toe engine.
Ruby
2
star
47

homebrew-gh

GH formulae for the Homebrew package manager
Ruby
2
star
48

testing_rest_web_services_with_rails

Ruby
2
star
49

StoryboardRecipes

Example app following the book "iOS SDK Development" from Pragmatic Programmer
Objective-C
2
star
50

gostart

Go
1
star
51

twitter_plus

an example of my talk about testing web service client
Ruby
1
star
52

isittheday.com

Ruby
1
star
53

jekyll_and_hyde_demo

An example presentation generated by jekyll_and_hyde
1
star
54

stats_foundry

Ruby
1
star
55

ijws

I Just Wanna Say
Ruby
1
star
56

karotz-proxy

Ruby
1
star
57

rails_engines_spike

Ruby
1
star
58

vpm

An awesome utility for managing Vim plugins.
Ruby
1
star
59

heroku-nginx-wasmer

Run Nginx with Wasmer on Heroku
HTML
1
star
60

api-proxy-spike

A spike to implement an API proxy
JavaScript
1
star
61

automatic_testing_of_rest_web_sevices_client_with_rails_source

Ruby
1
star
62

cortana

A Hubot for Twitter
CoffeeScript
1
star
63

odt

Owen's Development Tool
Go
1
star
64

rab

Rails Asset Builder (RAB)
Ruby
1
star
65

summarize-github-pull-requests

Perform automatic code reviews for GitHub pull requests (PR). The review is triggered when a PR is created and is triggered again for every subsequent commit in the PR. The code review is conducted for commit in the PR.
Rust
1
star
66

buildzilla

Ruby
1
star
67

shortenerclj

A URL shortener implemented in Clojure
Clojure
1
star
68

hurley

Hurley and Faraday are both from the lost island
Go
1
star
69

sinatra-jruby-heroku

Shell
1
star
70

jekyll_and_hyde_template

The source of the default jekyll_and_hyde template used by its generator.
1
star
71

gameserverstatus

gameserverstatus
Clojure
1
star
72

narc

Node.js CI Server
JavaScript
1
star
73

loading_path_gotchas_in_rails3

A gotchas on load path of Rails 3.
Ruby
1
star
74

testing_web_services_client_slides

JavaScript
1
star