Skip to content

Commit

Permalink
platform specific task override
Browse files Browse the repository at this point in the history
  • Loading branch information
sagiegurari committed Jun 28, 2017
1 parent 2f27596 commit 9620a71
Show file tree
Hide file tree
Showing 28 changed files with 1,881 additions and 2,422 deletions.
2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "cargo-make"
version = "0.2.7"
version = "0.2.8"
authors = ["Sagie Gur-Ari <sagiegurari@gmail.com>"]
description = "Rust task runner and build tool."
license = "Apache-2.0"
Expand Down
89 changes: 87 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,9 @@
* [Simple Example](#usage-simple)
* [Tasks, Dependencies and Aliases](#usage-task-dependencies-alias)
* [Default Tasks and Extending](#usage-default-tasks)
* [Continues Integration](#usage-ci)
* [Platform Override](#usage-platform-override)
* [Environment Variables](#usage-env)
* [Continues Integration](#usage-ci)
* [Cli Options](#usage-cli)
* [Makefile Definition](#usage-descriptor-definition)
* [Badge](#badge)
Expand Down Expand Up @@ -328,6 +329,63 @@ disabled = true
There is no need to redefine existing properties of the task, only what needs to be added or overwritten.<br>
The default toml file comes with many steps and flows already built in, so it is worth to check it first.

<a name="usage-platform-override"></a>
### Platform Override
In case you want to override a task or specific attributes in a task for specific platforms, you can define an override task with the platform name (currently linux, windows and mac) under the specific task.<br>
For example:

````toml
[tasks.hello-world]
script = [
"echo \"Hello World From Unknown\""
]

[tasks.hello-world.linux]
script = [
"echo \"Hello World From Linux\""
]
````

If you run cargo make with task 'hello-world' on linux, it would redirect to hello-world.linux while on other platforms it will execute the original hello-world.<br>
In linux the output would be:

````console
[cargo-make] info - Task: hello-world
[cargo-make] info - Setting Up Env.
[cargo-make] info - Running Task: hello-world
[cargo-make] info - Execute Command: "sh" "/tmp/cargo-make/kOUJfw8Vfc.sh"
Hello World From Linux
[cargo-make] info - Build done in 0 seconds.
````

While on other platforms

````console
[cargo-make] info - Task: hello-world
[cargo-make] info - Setting Up Env.
[cargo-make] info - Running Task: hello-world
[cargo-make] info - Execute Command: "sh" "/tmp/cargo-make/2gYnulOJLP.sh"
Hello World From Unknown
[cargo-make] info - Build done in 0 seconds.
````

In the override task you can define any attribute that will override the attribute of the parent task, while undefined attributes will use the value from the parent task and will not be modified.<br>
In case you need to delete attributes from the parent (for example script is only invoked if command is not defined and you have command defined in the parent task and script in the override task), then you will
have to clear the parent task in the override task using the clear attribute as follows:

````toml
[tasks.hello-world.linux]
clear = true
script = [
"echo \"Hello World From Linux\""
]
````

This means, however, that you will have to redefine all attributes in the override task that you want to carry with you from the parent task.<br>
**Important - alias comes before checking override task so if parent task has an alias it will be redirected to that task instead of the override.**<br>
**To override per platform, use the linux_alias, windows_alias, mac_alias attributes.<br>**
**In addition, aliases can not be defined in platform override tasks, only in parent tasks.**

<a name="usage-env"></a>
### Environment Variables
You can also define env vars to be set as part of the execution of the flow in the env block, for examle:
Expand Down Expand Up @@ -414,7 +472,33 @@ pub struct Task {
/// If command is not defined, and script is defined, the provided script will be executed
pub script: Option<Vec<String>>,
/// A list of tasks to execute before this task
pub dependencies: Option<Vec<String>>
pub dependencies: Option<Vec<String>>,
/// override task if runtime OS is Linux (takes precedence over alias)
pub linux: Option<PlatformOverrideTask>,
/// override task if runtime OS is Windows (takes precedence over alias)
pub windows: Option<PlatformOverrideTask>,
/// override task if runtime OS is Mac (takes precedence over alias)
pub mac: Option<PlatformOverrideTask>
}

/// Holds a single task configuration for a specific platform as an override of another task
pub struct PlatformOverrideTask {
/// if true, it should ignore all data in base task
clear: Option<bool>,
/// if true, the command/script of this task will not be invoked, depedencies however will be
disabled: Option<bool>,
/// if defined, the provided crate will be installed (if needed) before running the task
install_crate: Option<String>,
/// if defined, the provided script will be executed before running the task
install_script: Option<Vec<String>>,
/// The command to execute
command: Option<String>,
/// The command args
args: Option<Vec<String>>,
/// If command is not defined, and script is defined, the provided script will be executed
script: Option<Vec<String>>,
/// A list of tasks to execute before this task
dependencies: Option<Vec<String>>
}
````

Expand Down Expand Up @@ -457,6 +541,7 @@ See [contributing guide](.github/CONTRIBUTING.md)

| Date | Version | Description |
| ----------- | ------- | ----------- |
| 2017-06-28 | v0.2.8 | Platform specific task override |
| 2017-06-26 | v0.2.7 | Platform specific alias |
| 2017-06-26 | v0.2.6 | Enable task attributes override |
| 2017-06-25 | v0.2.3 | Added disabled task attribute support |
Expand Down
2 changes: 1 addition & 1 deletion docs/api/cargo_make/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ <h1 class='fqn'><span class='in-band'>Crate <a class="mod" href=''>cargo_make</a
<a id="toggle-all-docs" href="javascript:void(0)" title="collapse all docs">
[<span class='inner'>&#x2212;</span>]
</a>
</span><a class='srclink' href='../src/cargo_make/main.rs.html#1-113' title='goto source code'>[src]</a></span></h1>
</span><a class='srclink' href='../src/cargo_make/main.rs.html#1-117' title='goto source code'>[src]</a></span></h1>
<div class='docblock'>
<h1 id='cargo-make' class='section-header'><a href='#cargo-make'>cargo-make</a></h1>
<p>Rust task runner and build tool.<br>
Expand Down
30 changes: 4 additions & 26 deletions docs/api/src/cargo_make/cli.rs.html
Original file line number Diff line number Diff line change
Expand Up @@ -107,23 +107,16 @@
<span id="62">62</span>
<span id="63">63</span>
<span id="64">64</span>
<span id="65">65</span>
<span id="66">66</span>
<span id="67">67</span>
<span id="68">68</span>
<span id="69">69</span>
<span id="70">70</span>
<span id="71">71</span>
<span id="72">72</span>
<span id="73">73</span>
<span id="74">74</span>
<span id="75">75</span>
</pre><pre class="rust ">
<span class="doccomment">//! # cli</span>
<span class="doccomment">//!</span>
<span class="doccomment">//! Handles the command line arguments and executes the runner.</span>
<span class="doccomment">//!</span>

<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">test</span>)]</span>
<span class="attribute">#[<span class="ident">path</span> <span class="op">=</span> <span class="string">&quot;./cli_test.rs&quot;</span>]</span>
<span class="kw">mod</span> <span class="ident">cli_test</span>;

<span class="kw">use</span> <span class="ident">clap</span>::{<span class="ident">App</span>, <span class="ident">Arg</span>, <span class="ident">SubCommand</span>};
<span class="kw">use</span> <span class="ident">descriptor</span>;
<span class="kw">use</span> <span class="ident">log</span>;
Expand Down Expand Up @@ -179,21 +172,6 @@
<span class="prelude-val">None</span> <span class="op">=&gt;</span> <span class="macro">panic</span><span class="macro">!</span>(<span class="string">&quot;cargo-{} not invoked via cargo command.&quot;</span>, <span class="ident">NAME</span>),
}
}

<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">test</span>)]</span>
<span class="kw">mod</span> <span class="ident">tests</span> {
<span class="kw">use</span> <span class="kw">super</span>::<span class="kw-2">*</span>;

<span class="attribute">#[<span class="ident">test</span>]</span>
<span class="kw">fn</span> <span class="ident">run_empty_task</span>() {
<span class="ident">run</span>(<span class="string">&quot;bad.toml&quot;</span>, <span class="string">&quot;empty&quot;</span>, <span class="string">&quot;error&quot;</span>);
}

<span class="attribute">#[<span class="ident">test</span>]</span>
<span class="kw">fn</span> <span class="ident">run_file_and_task</span>() {
<span class="ident">run</span>(<span class="string">&quot;./examples/dependencies.toml&quot;</span>, <span class="string">&quot;A&quot;</span>, <span class="string">&quot;error&quot;</span>);
}
}
</pre>
</section>
<section id='search' class="content hidden"></section>
Expand Down
154 changes: 4 additions & 150 deletions docs/api/src/cargo_make/command.rs.html
Original file line number Diff line number Diff line change
Expand Up @@ -211,85 +211,16 @@
<span id="166">166</span>
<span id="167">167</span>
<span id="168">168</span>
<span id="169">169</span>
<span id="170">170</span>
<span id="171">171</span>
<span id="172">172</span>
<span id="173">173</span>
<span id="174">174</span>
<span id="175">175</span>
<span id="176">176</span>
<span id="177">177</span>
<span id="178">178</span>
<span id="179">179</span>
<span id="180">180</span>
<span id="181">181</span>
<span id="182">182</span>
<span id="183">183</span>
<span id="184">184</span>
<span id="185">185</span>
<span id="186">186</span>
<span id="187">187</span>
<span id="188">188</span>
<span id="189">189</span>
<span id="190">190</span>
<span id="191">191</span>
<span id="192">192</span>
<span id="193">193</span>
<span id="194">194</span>
<span id="195">195</span>
<span id="196">196</span>
<span id="197">197</span>
<span id="198">198</span>
<span id="199">199</span>
<span id="200">200</span>
<span id="201">201</span>
<span id="202">202</span>
<span id="203">203</span>
<span id="204">204</span>
<span id="205">205</span>
<span id="206">206</span>
<span id="207">207</span>
<span id="208">208</span>
<span id="209">209</span>
<span id="210">210</span>
<span id="211">211</span>
<span id="212">212</span>
<span id="213">213</span>
<span id="214">214</span>
<span id="215">215</span>
<span id="216">216</span>
<span id="217">217</span>
<span id="218">218</span>
<span id="219">219</span>
<span id="220">220</span>
<span id="221">221</span>
<span id="222">222</span>
<span id="223">223</span>
<span id="224">224</span>
<span id="225">225</span>
<span id="226">226</span>
<span id="227">227</span>
<span id="228">228</span>
<span id="229">229</span>
<span id="230">230</span>
<span id="231">231</span>
<span id="232">232</span>
<span id="233">233</span>
<span id="234">234</span>
<span id="235">235</span>
<span id="236">236</span>
<span id="237">237</span>
<span id="238">238</span>
<span id="239">239</span>
<span id="240">240</span>
<span id="241">241</span>
</pre><pre class="rust ">
<span class="doccomment">//! # command</span>
<span class="doccomment">//!</span>
<span class="doccomment">//! Runs task commands/scripts.</span>
<span class="doccomment">//!</span>

<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">test</span>)]</span>
<span class="attribute">#[<span class="ident">path</span> <span class="op">=</span> <span class="string">&quot;./command_test.rs&quot;</span>]</span>
<span class="kw">mod</span> <span class="ident">command_test</span>;

<span class="kw">use</span> <span class="ident">log</span>::<span class="ident">Logger</span>;
<span class="kw">use</span> <span class="ident">rand</span>::{<span class="ident">Rng</span>, <span class="ident">thread_rng</span>};
<span class="kw">use</span> <span class="ident">std</span>::<span class="ident">env</span>;
Expand Down Expand Up @@ -449,83 +380,6 @@
}
};
}

<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">test</span>)]</span>
<span class="kw">mod</span> <span class="ident">tests</span> {
<span class="kw">use</span> <span class="kw">super</span>::<span class="kw-2">*</span>;
<span class="kw">use</span> <span class="ident">log</span>;
<span class="kw">use</span> <span class="ident">std</span>::<span class="ident">io</span>::<span class="ident">ErrorKind</span>;
<span class="kw">use</span> <span class="ident">types</span>::<span class="ident">Task</span>;

<span class="attribute">#[<span class="ident">test</span>]</span>
<span class="attribute">#[<span class="ident">should_panic</span>]</span>
<span class="kw">fn</span> <span class="ident">validate_exit_code_error</span>() {
<span class="ident">validate_exit_code</span>(<span class="prelude-val">Err</span>(<span class="ident">Error</span>::<span class="ident">new</span>(<span class="ident">ErrorKind</span>::<span class="ident">Other</span>, <span class="string">&quot;test&quot;</span>)));
}

<span class="attribute">#[<span class="ident">test</span>]</span>
<span class="kw">fn</span> <span class="ident">run_no_command</span>() {
<span class="kw">let</span> <span class="ident">logger</span> <span class="op">=</span> <span class="ident">log</span>::<span class="ident">create</span>(<span class="string">&quot;error&quot;</span>);
<span class="kw">let</span> <span class="ident">task</span> <span class="op">=</span> <span class="ident">Task</span> {
<span class="ident">install_crate</span>: <span class="prelude-val">None</span>,
<span class="ident">command</span>: <span class="prelude-val">None</span>,
<span class="ident">args</span>: <span class="prelude-val">None</span>,
<span class="ident">disabled</span>: <span class="prelude-val">None</span>,
<span class="ident">alias</span>: <span class="prelude-val">None</span>,
<span class="ident">linux_alias</span>: <span class="prelude-val">None</span>,
<span class="ident">windows_alias</span>: <span class="prelude-val">None</span>,
<span class="ident">mac_alias</span>: <span class="prelude-val">None</span>,
<span class="ident">install_script</span>: <span class="prelude-val">None</span>,
<span class="ident">script</span>: <span class="prelude-val">None</span>,
<span class="ident">dependencies</span>: <span class="prelude-val">None</span>
};
<span class="kw">let</span> <span class="ident">step</span> <span class="op">=</span> <span class="ident">Step</span> { <span class="ident">name</span>: <span class="string">&quot;test&quot;</span>.<span class="ident">to_string</span>(), <span class="ident">config</span>: <span class="ident">task</span> };

<span class="ident">run</span>(<span class="kw-2">&amp;</span><span class="ident">logger</span>, <span class="kw-2">&amp;</span><span class="ident">step</span>);
}

<span class="attribute">#[<span class="ident">test</span>]</span>
<span class="kw">fn</span> <span class="ident">run_command</span>() {
<span class="kw">let</span> <span class="ident">logger</span> <span class="op">=</span> <span class="ident">log</span>::<span class="ident">create</span>(<span class="string">&quot;error&quot;</span>);
<span class="kw">let</span> <span class="ident">task</span> <span class="op">=</span> <span class="ident">Task</span> {
<span class="ident">command</span>: <span class="prelude-val">Some</span>(<span class="string">&quot;echo&quot;</span>.<span class="ident">to_string</span>()),
<span class="ident">args</span>: <span class="prelude-val">Some</span>(<span class="macro">vec</span><span class="macro">!</span>[<span class="string">&quot;1&quot;</span>.<span class="ident">to_string</span>()]),
<span class="ident">install_crate</span>: <span class="prelude-val">None</span>,
<span class="ident">disabled</span>: <span class="prelude-val">None</span>,
<span class="ident">alias</span>: <span class="prelude-val">None</span>,
<span class="ident">linux_alias</span>: <span class="prelude-val">None</span>,
<span class="ident">windows_alias</span>: <span class="prelude-val">None</span>,
<span class="ident">mac_alias</span>: <span class="prelude-val">None</span>,
<span class="ident">install_script</span>: <span class="prelude-val">None</span>,
<span class="ident">script</span>: <span class="prelude-val">None</span>,
<span class="ident">dependencies</span>: <span class="prelude-val">None</span>
};
<span class="kw">let</span> <span class="ident">step</span> <span class="op">=</span> <span class="ident">Step</span> { <span class="ident">name</span>: <span class="string">&quot;test&quot;</span>.<span class="ident">to_string</span>(), <span class="ident">config</span>: <span class="ident">task</span> };

<span class="ident">run</span>(<span class="kw-2">&amp;</span><span class="ident">logger</span>, <span class="kw-2">&amp;</span><span class="ident">step</span>);
}

<span class="attribute">#[<span class="ident">test</span>]</span>
<span class="kw">fn</span> <span class="ident">run_script</span>() {
<span class="kw">let</span> <span class="ident">logger</span> <span class="op">=</span> <span class="ident">log</span>::<span class="ident">create</span>(<span class="string">&quot;error&quot;</span>);
<span class="kw">let</span> <span class="ident">task</span> <span class="op">=</span> <span class="ident">Task</span> {
<span class="ident">script</span>: <span class="prelude-val">Some</span>(<span class="macro">vec</span><span class="macro">!</span>[<span class="string">&quot;echo 1&quot;</span>.<span class="ident">to_string</span>()]),
<span class="ident">command</span>: <span class="prelude-val">None</span>,
<span class="ident">install_crate</span>: <span class="prelude-val">None</span>,
<span class="ident">args</span>: <span class="prelude-val">None</span>,
<span class="ident">disabled</span>: <span class="prelude-val">None</span>,
<span class="ident">alias</span>: <span class="prelude-val">None</span>,
<span class="ident">linux_alias</span>: <span class="prelude-val">None</span>,
<span class="ident">windows_alias</span>: <span class="prelude-val">None</span>,
<span class="ident">mac_alias</span>: <span class="prelude-val">None</span>,
<span class="ident">install_script</span>: <span class="prelude-val">None</span>,
<span class="ident">dependencies</span>: <span class="prelude-val">None</span>
};
<span class="kw">let</span> <span class="ident">step</span> <span class="op">=</span> <span class="ident">Step</span> { <span class="ident">name</span>: <span class="string">&quot;test&quot;</span>.<span class="ident">to_string</span>(), <span class="ident">config</span>: <span class="ident">task</span> };

<span class="ident">run</span>(<span class="kw-2">&amp;</span><span class="ident">logger</span>, <span class="kw-2">&amp;</span><span class="ident">step</span>);
}
}
</pre>
</section>
<section id='search' class="content hidden"></section>
Expand Down
Loading

0 comments on commit 9620a71

Please sign in to comment.