-
Notifications
You must be signed in to change notification settings - Fork 2
/
index.html
201 lines (198 loc) · 12.5 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
<!DOCTYPE html><!--[if lt IE 7]>
<html class="lt-ie9 lt-ie8 lt-ie7"></html><![endif]--><!--[if IE 7]>
<html class="lt-ie9 lt-ie8"></html><![endif]--><!--[if IE 8]>
<html class="lt-ie9"></html><![endif]--><!--[if gt IE 8]>
<html class=""></html><![endif]-->
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="chrome=1">
<title>Anvil JS - Hammer Your Code Into Shape</title><!--
<link><link rel="stylesheet" href="stylesheets/pygment_trac.css">-->
<link rel="shortcut icon" href="/favicon.ico">
<link rel="icon" href="/favicon.ico">
<link rel="stylesheet" href="/public/css/main.css">
<script src="/public/javascripts/scale.fix.js"></script>
<script src="http://code.jquery.com/jquery-1.9.0.js"></script>
<script src="http://twitter.github.com/bootstrap/assets/js/bootstrap-scrollspy.js"></script>
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"><!--[if lt IE 9]>
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script><![endif]-->
<script>
$( function() {
$("#navbar").scrollspy( { offset: 20 } );
} );
</script>
</head>
<body data-spy="scroll" data-target="#navbar">
<header class="page-header slide"><img src="/public/images/anvil-logo.png" alt="Anvil JS" width="312" height="90" class="anvil-logo">
<div class="installation">
<h3>Install Via NPM</h3>
<pre> <code>npm install anvil.js -g</code></pre>
</div>
<!-- /.installation-->
<div class="github-links"><a href="https://github.com/anviljs/anvil.js" target="_blank" class="watch">Watch on Github</a><a href="https://github.com/anviljs/anvil.js" target="_blank" class="fork">Fork on Github</a></div>
<nav class="documentation-nav">
<h3><span class="icon">Navigation</span></h3>
<ol class="content-outline">
<li><a href="index.html">About</a></li>
<li><a href="/public/quick-start.html">Quick Start</a></li>
<li><a href="/public/conventions.html">Conventions</a></li>
<li><a href="/public/configuration.html">Configuration</a></li>
<li><a href="/public/http-host.html">HTTP Host</a></li>
<li><a href="/public/process-host.html">Process Host</a></li>
<li><a href="/public/extensions.html">Extensions</a></li>
<ul>
<li><a href="/public/plugins.html">Plugins</a></li>
<li><a href="/public/commands.html">Commands</a></li>
<li><a href="/public/scaffolds.html">Scaffolds</a></li>
<li><a href="/public/tasks.html">Tasks</a></li>
</ul>
</ol>
<div class="compatibility">
<p> <span>Compatible with </span><span class="logo-icons">Microsoft Windows, Apple OS X, and Linux</span></p>
<p></p>
</div>
<div class="appendto-link">
<p> <span>Sponsored By </span><span><a href="http://appendto.com">appendTo</a></span></p>
</div>
</nav>
</header>
<!-- /.page-left-->
<section class="page-content">
<div id="navbar">
<ul class="page-nav nav">
<!--h3 Sections-->
<li><a href="#about">About</a></li>
<li><a href="#features">Features</a></li>
<li><a href="#faq">FAQ</a></li>
<li><a href="#contributors">Contributors</a></li>
<li><a href="#legal">Legal</a></li>
</ul>
</div>
<div id="spacer"></div>
<h1 class="tagline">Hammer your code into shape</h1>
<article id="about" class="content-section"><h2>About</h2>
<p>Build tools that require a lot of explicit/declarative instructions are distracting.
Anvil is a build system with an extension-based architecture that prefers convention over configuration. There are a lot of great ways to add new features or change almost any behavior as needed.
</p>
<h3>This Site</h3>
<p>This site is a group effort to document the features and some of the extensions to Anvil. The source to the site itself is hosted <a href="http://github.com/anviljs/anviljs.github.com">here</a>.
If you so desire, you can submit pull requests to add documentation for your extensions or for things about the system you'd like to see covered. </p>
<!-- /#about-anvil-->
</article>
<article id="features" class="content-section">
<h2>Basic Features</h2>
<p>All parts of the build process are implemented as extensions (specifically as build plugins). Some extensions ship along with anvil's source so that it can do _something_ out of the box. Most of the interesting features will likely be extensions that you install.</p>
<p>A baseline install can do the following:</p>
<ul>
<li>Install, remove, enable or disable extensions</li>
<li>Automatically install any extensions your build file defines as dependencies</li>
<li>Run local extensions (an extension that's not installed from npm)</li>
<li>Continuously and incrementally build the project as files change</li>
<li>Host static resources in an HTTP server
<ul>
<li>Auto-refresh pages in the browser during CI mode</li>
<li>Provides APIs to extensions for customized behavior</li>
</ul>
</li>
<li>Start and manage external processes</li>
<li>Combine resource files through a comment-based import syntax</li>
<li>Concat resource files in specified order using
<ul>
<li>JSON or YAML file that lists files to create from other files</li>
<li>individual JSON or YAML files</li>
</ul>
</li>
<li>Replace tokens (with customizable syntax) in source with
<ul>
<li>values from package.json</li>
<li>JSON or YAML key/value files</li>
</ul>
</li>
<li>Add file headers to final build output based on output file type</li>
<li>Create default build files based on installed extensions</li>
</ul>
</article>
<!-- /#what-does-it-do-->
<article id="faq" class="content-section">
<h2>Frequently Asked Questions</h2>
<p id="question">Q. How is this different from Grunt?</p>
<p id="answer">A. Vastly, they are very different approaches to building projects.</p>
<p>Let us count the ways:</p>
<p>Imperative vs. Declarative</p>
<ul>
<li>Grunt takes a more imperative approach; required JS based build files
<li>Anvil takes a declarative approach; optional JSON build files</li>
</li>
</ul>
<p>Convention over Configuration</p>
<ul>
<li>Grunt provides no top-level conventions but unlimited flexibility; tasks can happen in *any* order
<li>Anvil has a predefined asynchronous build workflow; plugins identify what activities they belong to</li>
<li>Grunt requires a bit of setup per project and a build file in order to start using installed</li>
<li>Once Anvil is installed, it will attempt to build projects even if there is no build file.</li>
</li>
</ul>
<p>Extensions</p>
<ul>
<li>Grunt requires tasks to be installed locally per projects
<li>Anvil's extensions are installed globally with optional local overrides</li>
<li>Grunt provides tasks as the primary way to define a build</li>
<li>Anvil provides 4 types of extensions: plugins, commands, tasks and scaffolds</li>
</li>
</ul>
<p>Another way to think about it is; Grunt can technically do anything but requires more effort to get common things done. Anvil's conventions and concepts satisfy a lot of common use cases with little effort and also provide several ways to extend the system.</p>
<p id="question">Q. How is this different from Yeoman?</p>
<p id="answer">A. Yeoman is far more opinionated.</p>
<p>Yeoman and Anvil are similar in that they pull together many excellent open source libraries in order to help you with your project workflow. Yeoman is different in that it is very opinionated and has been built to use specific libraries for specific features; the end result is a very polished user experience but it comes at the expense of tight coupling to dependencies. Anvil has been designed to be so flexible that you can easily replace any behavior or feature with your own extension using a different set of open source libraries and get exactly the behavior you want. Feel like something's missing? You can add entirely new features and abilities (or even new types of extensions) to Anvil.</p>
<p id="question">Q. Why does Anvil install globally?</p>
<p id="answer">A. Convenience, simplicity, speed.</p>
<p>Less setup effort on a per project basis means less time fiddling with a build system and more time spent on your project. Most of Anvil's extensions that aren't considered "core" to the build are opt-in or non-intrusive so you don't have to worry about a globally installed extension ruining your day. An additional advantage of a global plugins is that Anvil can manage keeping them up-to-date with one simple console command: anvil update. No need to worry about updating individual extensions on a per project basis.</p>
</article>
<div id="contributors" class="contributors content-section">
<h2>Contributors</h2>
<p>Special thanks to the following individuals who have contributed source code or ideas to help make anvil less buggy and more useful:</p>
<ul class="contributors-list">
<li><a href="https://github.com/dcneiner">Doug Neiner</a></li>
<li><a href="https://github.com/eliperelman">Eli Perelman</a></li>
<li><a href="https://github.com/jcreamer898">Jonathan Creamer</a></li>
<li><a href="https://github.com/brianedgerton">Brian Edgerton</a></li>
<li><a href="https://github.com/ifandelse">Jim Cowart</a></li>
<li><a href="https://github.com/elijahmanor">Elijah Manor</a></li>
<li><a href="https://github.com/aaronmccall">Aaron McCall</a></li>
<li><a href="https://github.com/mikesten">Mike Stenhouse</a></li>
<li><a href="https://github.com/robertmesserle">Robert Messerle</a></li>
<li><a href="https://github.com/mikehostetler">Mike Hostetler</a></li>
<li><a href="https://github.com/derickbailey">Derick Bailey</a></li>
</ul>
<!-- /#contributors-->
</div>
<article id="legal" class="legal content-section">
<h2>Legal Bits</h2>
<p><span>"Anvil.js"( also referred to as "Anvil") is owned by </span><a href="https://github.com/arobson">Alex Robson</a><span>. All rights not explicitly granted in the MIT or GPL license are reserved. See the included LICENSE-* files for more details.</span></p>
<p>Extensions to Anvil (plugins, commands, tasks, etc.) are not part of Anvil itself, and are the sole property of their respective maintainers. While every effort is made to ensure accountability, there is absolutely no guarantee, warrantee, or assertion made as to the quality, fitness for a specific purpose, or lack of malice in any given extension. Extensions published on the npm registry are not affiliated with or endorsed by myself (Alex Robson) or my employer unless otherwise stated in the repository for the extension.</p>
<p> <span>If you have a complaint about an extension, and cannot resolve it with the package owner, please express your concerns to </span><a href="mailto:[email protected]">[email protected].</a></p>
<h3>In plain english</h3>
<p>This is mine; not my employer's. They have graciously supported the efforts and made contributions but are in no way responsible or liable for it's suitability or function.</p>
<p>If you create and publish an extension, it's yours, and you are solely accountable for it. Not me, not my employer.</p>
<p>If other people create and publish an extension, it's theirs. Not mine, not my employer's.</p>
<p>Malicious extensions could be published; consider the author behind the extension and perhaps review the code. There is no vetting process for published extensions.</p>
<p>If this concerns you, inspect the source before installing or using any extension.</p>
<!-- /#legal-->
</article>
</section>
<!-- /.page-right-->
<script>
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-38164098-1']);
_gaq.push(['_setDomainName', 'anviljs.com']);
_gaq.push(['_setAllowLinker', true]);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script');
ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(ga, s);
})();
</script>
</body>