Skip to content

Instantly share code, notes, and snippets.

@bradphelan
Last active August 29, 2015 14:17
Show Gist options
  • Save bradphelan/f2e77b39ce1c50ab2d60 to your computer and use it in GitHub Desktop.
Save bradphelan/f2e77b39ce1c50ab2d60 to your computer and use it in GitHub Desktop.
#I @"../../lib/Fake/tools"
#r @"FakeLib.dll"
#load @"Fake.DSC.fsx"
open Fake
open System.IO
open Fake.DSC
// Fake isn't really like make even though it pretends to be. The cool thing about make
// is that it only builds stuff when it needs to be changed. Fake builds everything every time. You
// can add conditions on the dependencies but there are no real built in methods for change
// tracking.
// The below demonstrates a simple framework for change tracking
// based on MD5 signitures. A fingerprint database is saved between builds to
// detect upstream changes and actions will only be triggered if the signiture of
// any of the upstream dependencies change.
// Fake's inbuilt dependency trees are used but are handled automatically within
// the DSL
// Questions or suggestions to
// @bradgonesurfing on twitter
FileTarget.CopyTo "a.txt" "aa.txt"
"build.out" <== [| "a.txt"; "b.txt" |] <|
fun target sources ->
let text =
sources
|> Seq.map File.ReadAllText
File.WriteAllText(target, System.String.Join("\n", text))
TemplateTarget.Build "message.out" [| ("@name","brad"); ("@age","24")|] "message.tpl"
ZipTarget.Build id "build.zip" [| "build.out"; "message.out" |]
FileTarget.Run "build.zip"
#r @"..\..\lib\FAKE\tools\FakeLib.dll"
#r "System.Runtime.Serialization.dll"
open Fake
open System
open System.Collections.Generic
open System.IO
open System.Security.Cryptography
open System.Runtime.Serialization
open System.Xml
let md5 file =
let info = file |> fileInfo
match info with
| x when not x.Exists -> failwithf "File %s does not exist." x.FullName
| x when x.Length = 0L -> ""
| x ->
use hashAlgorithm = new MD5CryptoServiceProvider()
File.ReadAllBytes(x.FullName)
|> hashAlgorithm.ComputeHash
|> BitConverter.ToString
type target =
val id:string
new(id:string, action:unit->unit, condition:unit->bool) = { id = id} then
Target id (fun () ->
if condition() then
traceFAKE "Executing target %s" id
action()
else
traceFAKE "Skipping target %s" id
)
new(id:string) = {id = id} then
if TargetDict.ContainsKey id |> not then
tracefn "YY: Creating target %s" id
Target id DoNothing
module HashTarget =
let dbFile = "db.fake"
let dict =
try
use stream = new FileStream(dbFile, FileMode.Open)
use reader = XmlDictionaryReader.CreateTextReader(stream, XmlDictionaryReaderQuotas())
let ser = DataContractSerializer(typeof<Dictionary<string*string,string>>)
ser.ReadObject(reader, true) :?> Dictionary<string*string,string>
with _ -> Dictionary<_, _>()
FinalTarget "SaveHash" ( fun _ ->
use writer = new FileStream(dbFile, FileMode.Create)
let ser = new DataContractSerializer(dict.GetType())
ser.WriteObject(writer, dict)
)
ActivateFinalTarget "SaveHash"
/// <summary>
/// Runs an action if the hashes change from the previous build. By
/// convention the head of the hashes sequence is the target and the tail
/// contains the sources.
/// </summary>
/// <param name="action"></param>
/// <param name="hashes"></param>
let create (action:unit->unit) (hashes:(string*(unit->string)) seq) : target =
// By convention the head is the target
let (targetId,_) = Seq.head hashes
// Ensure that the sources are all valid FAKE targets
hashes
|> Seq.skip 1
|> Seq.iter ( fun (sourceId,_) -> target(sourceId) |> ignore)
// wrap the action so that the hashes are updated on
// successfull execution of the action
let action = fun _ ->
action()
hashes
|> Seq.iter (fun (sourceId, hashF) ->
dict.[(targetId,sourceId)] <- hashF() )
// the condition returns true if the hashes have changed
// since the last time
let condition = fun _ ->
hashes
|> Seq.exists (fun (sourceId, hashF) ->
match dict.TryGetValue((targetId,sourceId)) with
| true, sourceHash -> sourceHash <> hashF()
| _ -> true
)
// hook the FAKE target system
let t = target(targetId, action, condition)
// hook the FAKE dependency system
hashes
|> Seq.iter (fun (sourceId, _) ->
tracefn "%s ==> %s" sourceId targetId
if(sourceId<>targetId)then sourceId ==> targetId |> ignore)
t
module FileTarget =
let private fileTargetId name =
( "file://" + (Path.GetFullPath name |> FileSystemHelper.normalizeFileName ))
let Build targetFile (sourceFiles:string seq) (action:string->string seq->unit) =
let action() =
action targetFile sourceFiles
let hashes =
seq {
// Target hash
yield (fileTargetId targetFile, ( fun _ ->
if File.Exists targetFile then
md5 targetFile
else "") )
// Source hashes
for f in sourceFiles do
yield fileTargetId f, fun _ ->
md5 f
}
HashTarget.create action hashes
let CopyTo targetFile sourceFile =
Build targetFile [|sourceFile|] (fun _ _ -> FileHelper.CopyFile targetFile sourceFile )
let Run targetFile =
RunTargetOrDefault (fileTargetId targetFile)
let (<==) target sources =
fun action ->
FileTarget.Build target sources action
module ZipTarget =
type Config = {
WorkingDir : string
Comment : string
Level : int
Flatten : bool
}
let Build cfgfn targetFile (sourceFiles:string seq) =
let cfg = cfgfn {
WorkingDir = "."
Comment=""
Level=4
Flatten=false
}
let action targetFile sources =
ZipHelper.CreateZip cfg.WorkingDir targetFile cfg.Comment cfg.Level cfg.Flatten sources
FileTarget.Build targetFile sourceFiles action
module TemplateTarget =
let Build targetFile replacements templateFile =
let action _ _ =
FileHelper.CopyFile targetFile templateFile
TemplateHelper.processTemplates replacements [| targetFile |]
FileTarget.Build targetFile [templateFile] action
C:\Users\phelan\workspace\Build.Tools\scripts\DSC [implement-dsc +3 ~6 -0 !]
> ..\..\lib\FAKE\tools\Fake.exe
YY: Creating target file://c:\users\phelan\workspace\build.tools\scripts\dsc\aa.txt
YY: Creating target file://c:\users\phelan\workspace\build.tools\scripts\dsc\b.txt
YY: Creating target file://c:\users\phelan\workspace\build.tools\scripts\dsc\message.tpl
Building project with version: LocalBuild
Shortened DependencyGraph for Target file://c:\users\phelan\workspace\build.tools\scripts\dsc\build.zip:
<== file://c:\users\phelan\workspace\build.tools\scripts\dsc\build.zip
<== file://c:\users\phelan\workspace\build.tools\scripts\dsc\build.out
<== file://c:\users\phelan\workspace\build.tools\scripts\dsc\a.txt
<== file://c:\users\phelan\workspace\build.tools\scripts\dsc\aa.txt
<== file://c:\users\phelan\workspace\build.tools\scripts\dsc\b.txt
<== file://c:\users\phelan\workspace\build.tools\scripts\dsc\message.out
<== file://c:\users\phelan\workspace\build.tools\scripts\dsc\message.tpl
The resulting target order is:
- file://c:\users\phelan\workspace\build.tools\scripts\dsc\aa.txt
- file://c:\users\phelan\workspace\build.tools\scripts\dsc\a.txt
- file://c:\users\phelan\workspace\build.tools\scripts\dsc\b.txt
- file://c:\users\phelan\workspace\build.tools\scripts\dsc\build.out
- file://c:\users\phelan\workspace\build.tools\scripts\dsc\message.tpl
- file://c:\users\phelan\workspace\build.tools\scripts\dsc\message.out
- file://c:\users\phelan\workspace\build.tools\scripts\dsc\build.zip
Starting Target: file://c:\users\phelan\workspace\build.tools\scripts\dsc\aa.txt
Finished Target: file://c:\users\phelan\workspace\build.tools\scripts\dsc\aa.txt
Starting Target: file://c:\users\phelan\workspace\build.tools\scripts\dsc\a.txt (==> file://c:\users\phelan\workspace\bu
ild.tools\scripts\dsc\aa.txt)
Executing target file://c:\users\phelan\workspace\build.tools\scripts\dsc\a.txt
Finished Target: file://c:\users\phelan\workspace\build.tools\scripts\dsc\a.txt
Starting Target: file://c:\users\phelan\workspace\build.tools\scripts\dsc\b.txt
Finished Target: file://c:\users\phelan\workspace\build.tools\scripts\dsc\b.txt
Starting Target: file://c:\users\phelan\workspace\build.tools\scripts\dsc\build.out (==> file://c:\users\phelan\workspac
e\build.tools\scripts\dsc\a.txt, file://c:\users\phelan\workspace\build.tools\scripts\dsc\b.txt)
Executing target file://c:\users\phelan\workspace\build.tools\scripts\dsc\build.out
Finished Target: file://c:\users\phelan\workspace\build.tools\scripts\dsc\build.out
Starting Target: file://c:\users\phelan\workspace\build.tools\scripts\dsc\message.tpl
Finished Target: file://c:\users\phelan\workspace\build.tools\scripts\dsc\message.tpl
Starting Target: file://c:\users\phelan\workspace\build.tools\scripts\dsc\message.out (==> file://c:\users\phelan\worksp
ace\build.tools\scripts\dsc\message.tpl)
Executing target file://c:\users\phelan\workspace\build.tools\scripts\dsc\message.out
Finished Target: file://c:\users\phelan\workspace\build.tools\scripts\dsc\message.out
Starting Target: file://c:\users\phelan\workspace\build.tools\scripts\dsc\build.zip (==> file://c:\users\phelan\workspac
e\build.tools\scripts\dsc\build.out, file://c:\users\phelan\workspace\build.tools\scripts\dsc\message.out)
Executing target file://c:\users\phelan\workspace\build.tools\scripts\dsc\build.zip
Creating Zipfile: build.zip (Level: 4)
Adding File build.out
Adding File message.out
Zip successfully created build.zip
Finished Target: file://c:\users\phelan\workspace\build.tools\scripts\dsc\build.zip
Starting FinalTarget: savehash
---------------------------------------------------------------------
Build Time Report
---------------------------------------------------------------------
Target Duration
------ --------
file://c:\users\phelan\workspace\build.tools\scripts\dsc\aa.txt 00:00:00.0001822
file://c:\users\phelan\workspace\build.tools\scripts\dsc\a.txt 00:00:00.0081052
file://c:\users\phelan\workspace\build.tools\scripts\dsc\b.txt 00:00:00.0000003
file://c:\users\phelan\workspace\build.tools\scripts\dsc\build.out 00:00:00.0027720
file://c:\users\phelan\workspace\build.tools\scripts\dsc\message.tpl 00:00:00.0000003
file://c:\users\phelan\workspace\build.tools\scripts\dsc\message.out 00:00:00.0104791
file://c:\users\phelan\workspace\build.tools\scripts\dsc\build.zip 00:00:00.0351777
SaveHash 00:00:00.0059316
Total: 00:00:00.0833236
Status: Ok
---------------------------------------------------------------------
C:\Users\phelan\workspace\Build.Tools\scripts\DSC [implement-dsc +3 ~6 -0 !]
>
> ..\..\lib\FAKE\tools\Fake.exe
YY: Creating target file://c:\users\phelan\workspace\build.tools\scripts\dsc\aa.txt
YY: Creating target file://c:\users\phelan\workspace\build.tools\scripts\dsc\b.txt
YY: Creating target file://c:\users\phelan\workspace\build.tools\scripts\dsc\message.tpl
Building project with version: LocalBuild
Shortened DependencyGraph for Target file://c:\users\phelan\workspace\build.tools\scripts\dsc\build.zip:
<== file://c:\users\phelan\workspace\build.tools\scripts\dsc\build.zip
<== file://c:\users\phelan\workspace\build.tools\scripts\dsc\build.out
<== file://c:\users\phelan\workspace\build.tools\scripts\dsc\a.txt
<== file://c:\users\phelan\workspace\build.tools\scripts\dsc\aa.txt
<== file://c:\users\phelan\workspace\build.tools\scripts\dsc\b.txt
<== file://c:\users\phelan\workspace\build.tools\scripts\dsc\message.out
<== file://c:\users\phelan\workspace\build.tools\scripts\dsc\message.tpl
The resulting target order is:
- file://c:\users\phelan\workspace\build.tools\scripts\dsc\aa.txt
- file://c:\users\phelan\workspace\build.tools\scripts\dsc\a.txt
- file://c:\users\phelan\workspace\build.tools\scripts\dsc\b.txt
- file://c:\users\phelan\workspace\build.tools\scripts\dsc\build.out
- file://c:\users\phelan\workspace\build.tools\scripts\dsc\message.tpl
- file://c:\users\phelan\workspace\build.tools\scripts\dsc\message.out
- file://c:\users\phelan\workspace\build.tools\scripts\dsc\build.zip
Starting Target: file://c:\users\phelan\workspace\build.tools\scripts\dsc\aa.txt
Finished Target: file://c:\users\phelan\workspace\build.tools\scripts\dsc\aa.txt
Starting Target: file://c:\users\phelan\workspace\build.tools\scripts\dsc\a.txt (==> file://c:\users\phelan\workspace\bu
ild.tools\scripts\dsc\aa.txt)
Skipping target file://c:\users\phelan\workspace\build.tools\scripts\dsc\a.txt
Finished Target: file://c:\users\phelan\workspace\build.tools\scripts\dsc\a.txt
Starting Target: file://c:\users\phelan\workspace\build.tools\scripts\dsc\b.txt
Finished Target: file://c:\users\phelan\workspace\build.tools\scripts\dsc\b.txt
Starting Target: file://c:\users\phelan\workspace\build.tools\scripts\dsc\build.out (==> file://c:\users\phelan\workspac
e\build.tools\scripts\dsc\a.txt, file://c:\users\phelan\workspace\build.tools\scripts\dsc\b.txt)
Skipping target file://c:\users\phelan\workspace\build.tools\scripts\dsc\build.out
Finished Target: file://c:\users\phelan\workspace\build.tools\scripts\dsc\build.out
Starting Target: file://c:\users\phelan\workspace\build.tools\scripts\dsc\message.tpl
Finished Target: file://c:\users\phelan\workspace\build.tools\scripts\dsc\message.tpl
Starting Target: file://c:\users\phelan\workspace\build.tools\scripts\dsc\message.out (==> file://c:\users\phelan\worksp
ace\build.tools\scripts\dsc\message.tpl)
Skipping target file://c:\users\phelan\workspace\build.tools\scripts\dsc\message.out
Finished Target: file://c:\users\phelan\workspace\build.tools\scripts\dsc\message.out
Starting Target: file://c:\users\phelan\workspace\build.tools\scripts\dsc\build.zip (==> file://c:\users\phelan\workspac
e\build.tools\scripts\dsc\build.out, file://c:\users\phelan\workspace\build.tools\scripts\dsc\message.out)
Skipping target file://c:\users\phelan\workspace\build.tools\scripts\dsc\build.zip
Finished Target: file://c:\users\phelan\workspace\build.tools\scripts\dsc\build.zip
Starting FinalTarget: savehash
---------------------------------------------------------------------
Build Time Report
---------------------------------------------------------------------
Target Duration
------ --------
file://c:\users\phelan\workspace\build.tools\scripts\dsc\aa.txt 00:00:00.0001773
file://c:\users\phelan\workspace\build.tools\scripts\dsc\a.txt 00:00:00.0026811
file://c:\users\phelan\workspace\build.tools\scripts\dsc\b.txt 00:00:00.0000003
file://c:\users\phelan\workspace\build.tools\scripts\dsc\build.out 00:00:00.0008334
file://c:\users\phelan\workspace\build.tools\scripts\dsc\message.tpl 00:00:00
file://c:\users\phelan\workspace\build.tools\scripts\dsc\message.out 00:00:00.0003730
file://c:\users\phelan\workspace\build.tools\scripts\dsc\build.zip 00:00:00.0005704
SaveHash 00:00:00.0051194
Total: 00:00:00.0274193
Status: Ok
---------------------------------------------------------------------
C:\Users\phelan\workspace\Build.Tools\scripts\DSC [implement-dsc +3 ~6 -0 !]
>
C:\Users\phelan\workspace\Build.Tools\scripts\DSC [implement-dsc +3 ~6 -0 !]
> echo "update file" > "aa.txt"
C:\Users\phelan\workspace\Build.Tools\scripts\DSC [implement-dsc +3 ~6 -0 !]
> ..\..\lib\FAKE\tools\Fake.exe
YY: Creating target file://c:\users\phelan\workspace\build.tools\scripts\dsc\aa.txt
YY: Creating target file://c:\users\phelan\workspace\build.tools\scripts\dsc\b.txt
YY: Creating target file://c:\users\phelan\workspace\build.tools\scripts\dsc\message.tpl
Building project with version: LocalBuild
Shortened DependencyGraph for Target file://c:\users\phelan\workspace\build.tools\scripts\dsc\build.zip:
<== file://c:\users\phelan\workspace\build.tools\scripts\dsc\build.zip
<== file://c:\users\phelan\workspace\build.tools\scripts\dsc\build.out
<== file://c:\users\phelan\workspace\build.tools\scripts\dsc\a.txt
<== file://c:\users\phelan\workspace\build.tools\scripts\dsc\aa.txt
<== file://c:\users\phelan\workspace\build.tools\scripts\dsc\b.txt
<== file://c:\users\phelan\workspace\build.tools\scripts\dsc\message.out
<== file://c:\users\phelan\workspace\build.tools\scripts\dsc\message.tpl
The resulting target order is:
- file://c:\users\phelan\workspace\build.tools\scripts\dsc\aa.txt
- file://c:\users\phelan\workspace\build.tools\scripts\dsc\a.txt
- file://c:\users\phelan\workspace\build.tools\scripts\dsc\b.txt
- file://c:\users\phelan\workspace\build.tools\scripts\dsc\build.out
- file://c:\users\phelan\workspace\build.tools\scripts\dsc\message.tpl
- file://c:\users\phelan\workspace\build.tools\scripts\dsc\message.out
- file://c:\users\phelan\workspace\build.tools\scripts\dsc\build.zip
Starting Target: file://c:\users\phelan\workspace\build.tools\scripts\dsc\aa.txt
Finished Target: file://c:\users\phelan\workspace\build.tools\scripts\dsc\aa.txt
Starting Target: file://c:\users\phelan\workspace\build.tools\scripts\dsc\a.txt (==> file://c:\users\phelan\workspace\bu
ild.tools\scripts\dsc\aa.txt)
Executing target file://c:\users\phelan\workspace\build.tools\scripts\dsc\a.txt
Finished Target: file://c:\users\phelan\workspace\build.tools\scripts\dsc\a.txt
Starting Target: file://c:\users\phelan\workspace\build.tools\scripts\dsc\b.txt
Finished Target: file://c:\users\phelan\workspace\build.tools\scripts\dsc\b.txt
Starting Target: file://c:\users\phelan\workspace\build.tools\scripts\dsc\build.out (==> file://c:\users\phelan\workspac
e\build.tools\scripts\dsc\a.txt, file://c:\users\phelan\workspace\build.tools\scripts\dsc\b.txt)
Executing target file://c:\users\phelan\workspace\build.tools\scripts\dsc\build.out
Finished Target: file://c:\users\phelan\workspace\build.tools\scripts\dsc\build.out
Starting Target: file://c:\users\phelan\workspace\build.tools\scripts\dsc\message.tpl
Finished Target: file://c:\users\phelan\workspace\build.tools\scripts\dsc\message.tpl
Starting Target: file://c:\users\phelan\workspace\build.tools\scripts\dsc\message.out (==> file://c:\users\phelan\worksp
ace\build.tools\scripts\dsc\message.tpl)
Skipping target file://c:\users\phelan\workspace\build.tools\scripts\dsc\message.out
Finished Target: file://c:\users\phelan\workspace\build.tools\scripts\dsc\message.out
Starting Target: file://c:\users\phelan\workspace\build.tools\scripts\dsc\build.zip (==> file://c:\users\phelan\workspac
e\build.tools\scripts\dsc\build.out, file://c:\users\phelan\workspace\build.tools\scripts\dsc\message.out)
Executing target file://c:\users\phelan\workspace\build.tools\scripts\dsc\build.zip
Creating Zipfile: build.zip (Level: 4)
Adding File build.out
Adding File message.out
Zip successfully created build.zip
Finished Target: file://c:\users\phelan\workspace\build.tools\scripts\dsc\build.zip
Starting FinalTarget: savehash
---------------------------------------------------------------------
Build Time Report
---------------------------------------------------------------------
Target Duration
------ --------
file://c:\users\phelan\workspace\build.tools\scripts\dsc\aa.txt 00:00:00.0001755
file://c:\users\phelan\workspace\build.tools\scripts\dsc\a.txt 00:00:00.0077410
file://c:\users\phelan\workspace\build.tools\scripts\dsc\b.txt 00:00:00.0000003
file://c:\users\phelan\workspace\build.tools\scripts\dsc\build.out 00:00:00.0027253
file://c:\users\phelan\workspace\build.tools\scripts\dsc\message.tpl 00:00:00.0000003
file://c:\users\phelan\workspace\build.tools\scripts\dsc\message.out 00:00:00.0003970
file://c:\users\phelan\workspace\build.tools\scripts\dsc\build.zip 00:00:00.0329985
SaveHash 00:00:00.0055741
Total: 00:00:00.0683635
Status: Ok
---------------------------------------------------------------------
C:\Users\phelan\workspace\Build.Tools\scripts\DSC [implement-dsc +3 ~6 -0 !]
>
<?xml version="1.0" encoding="UTF-8"?>
<ArrayOfKeyValueOfTupleOfstringstringstringRDHGY3MA xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<KeyValueOfTupleOfstringstringstringRDHGY3MA>
<Key xmlns:a="http://schemas.datacontract.org/2004/07/System">
<a:m_Item1>a.txt</a:m_Item1>
<a:m_Item2>aa.txt</a:m_Item2>
</Key>
<Value>4D-4F-BA-CD-87-33-6D-34-3E-B1-84-00-48-85-D3-AD</Value>
</KeyValueOfTupleOfstringstringstringRDHGY3MA>
<KeyValueOfTupleOfstringstringstringRDHGY3MA>
<Key xmlns:a="http://schemas.datacontract.org/2004/07/System">
<a:m_Item1>build.out</a:m_Item1>
<a:m_Item2>a.txt</a:m_Item2>
</Key>
<Value>4D-4F-BA-CD-87-33-6D-34-3E-B1-84-00-48-85-D3-AD</Value>
</KeyValueOfTupleOfstringstringstringRDHGY3MA>
<KeyValueOfTupleOfstringstringstringRDHGY3MA>
<Key xmlns:a="http://schemas.datacontract.org/2004/07/System">
<a:m_Item1>build.out</a:m_Item1>
<a:m_Item2>b.txt</a:m_Item2>
</Key>
<Value>46-0E-16-E6-7F-A7-8C-34-F9-B1-0E-F2-DC-53-70-C7</Value>
</KeyValueOfTupleOfstringstringstringRDHGY3MA>
<KeyValueOfTupleOfstringstringstringRDHGY3MA>
<Key xmlns:a="http://schemas.datacontract.org/2004/07/System">
<a:m_Item1>file://c:\users\phelan\workspace\build.tools\scripts\dsc\a.txt</a:m_Item1>
<a:m_Item2>file://c:\users\phelan\workspace\build.tools\scripts\dsc\aa.txt</a:m_Item2>
</Key>
<Value>4F-59-C0-52-09-77-8A-9C-59-18-16-35-C1-A1-37-7F</Value>
</KeyValueOfTupleOfstringstringstringRDHGY3MA>
<KeyValueOfTupleOfstringstringstringRDHGY3MA>
<Key xmlns:a="http://schemas.datacontract.org/2004/07/System">
<a:m_Item1>file://c:\users\phelan\workspace\build.tools\scripts\dsc\build.out</a:m_Item1>
<a:m_Item2>file://c:\users\phelan\workspace\build.tools\scripts\dsc\a.txt</a:m_Item2>
</Key>
<Value>4F-59-C0-52-09-77-8A-9C-59-18-16-35-C1-A1-37-7F</Value>
</KeyValueOfTupleOfstringstringstringRDHGY3MA>
<KeyValueOfTupleOfstringstringstringRDHGY3MA>
<Key xmlns:a="http://schemas.datacontract.org/2004/07/System">
<a:m_Item1>file://c:\users\phelan\workspace\build.tools\scripts\dsc\build.out</a:m_Item1>
<a:m_Item2>file://c:\users\phelan\workspace\build.tools\scripts\dsc\b.txt</a:m_Item2>
</Key>
<Value>46-0E-16-E6-7F-A7-8C-34-F9-B1-0E-F2-DC-53-70-C7</Value>
</KeyValueOfTupleOfstringstringstringRDHGY3MA>
<KeyValueOfTupleOfstringstringstringRDHGY3MA>
<Key xmlns:a="http://schemas.datacontract.org/2004/07/System">
<a:m_Item1>file://c:\users\phelan\workspace\build.tools\scripts\dsc\build.zip</a:m_Item1>
<a:m_Item2>file://c:\users\phelan\workspace\build.tools\scripts\dsc\build.out</a:m_Item2>
</Key>
<Value>BA-EA-27-CC-04-A7-CA-4F-B5-21-CC-0D-95-64-98-E0</Value>
</KeyValueOfTupleOfstringstringstringRDHGY3MA>
<KeyValueOfTupleOfstringstringstringRDHGY3MA>
<Key xmlns:a="http://schemas.datacontract.org/2004/07/System">
<a:m_Item1>file://c:\users\phelan\workspace\build.tools\scripts\dsc\message.out</a:m_Item1>
<a:m_Item2>file://c:\users\phelan\workspace\build.tools\scripts\dsc\message.tpl</a:m_Item2>
</Key>
<Value>61-FE-6D-3C-C4-21-8E-73-5D-D8-BD-17-F7-0E-DA-32</Value>
</KeyValueOfTupleOfstringstringstringRDHGY3MA>
<KeyValueOfTupleOfstringstringstringRDHGY3MA>
<Key xmlns:a="http://schemas.datacontract.org/2004/07/System">
<a:m_Item1>file://c:\users\phelan\workspace\build.tools\scripts\dsc\build.zip</a:m_Item1>
<a:m_Item2>file://c:\users\phelan\workspace\build.tools\scripts\dsc\message.out</a:m_Item2>
</Key>
<Value>B4-2D-B4-6E-35-98-FD-77-CB-5D-8E-F7-0C-7D-F7-2A</Value>
</KeyValueOfTupleOfstringstringstringRDHGY3MA>
</ArrayOfKeyValueOfTupleOfstringstringstringRDHGY3MA>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment