Skip to content

Commit 5e6d94d

Browse files
Initial implementation of LiveComponent
1 parent 9cf88a0 commit 5e6d94d

8 files changed

+296
-43
lines changed

.paket/Paket.Restore.targets

+52-39
Original file line numberDiff line numberDiff line change
@@ -20,18 +20,18 @@
2020
<PaketBootstrapperStyle Condition="Exists('$(PaketToolsPath)paket.bootstrapper.proj')">proj</PaketBootstrapperStyle>
2121
<PaketExeImage>assembly</PaketExeImage>
2222
<PaketExeImage Condition=" '$(PaketBootstrapperStyle)' == 'proj' ">native</PaketExeImage>
23-
<MonoPath Condition="'$(MonoPath)' == '' And Exists('/Library/Frameworks/Mono.framework/Commands/mono')">/Library/Frameworks/Mono.framework/Commands/mono</MonoPath>
23+
<MonoPath Condition="'$(MonoPath)' == '' AND Exists('/Library/Frameworks/Mono.framework/Commands/mono')">/Library/Frameworks/Mono.framework/Commands/mono</MonoPath>
2424
<MonoPath Condition="'$(MonoPath)' == ''">mono</MonoPath>
2525

2626
<!-- PaketBootStrapper -->
2727
<PaketBootStrapperExePath Condition=" '$(PaketBootStrapperExePath)' == '' AND Exists('$(PaketRootPath)paket.bootstrapper.exe')">$(PaketRootPath)paket.bootstrapper.exe</PaketBootStrapperExePath>
2828
<PaketBootStrapperExePath Condition=" '$(PaketBootStrapperExePath)' == '' ">$(PaketToolsPath)paket.bootstrapper.exe</PaketBootStrapperExePath>
2929
<PaketBootStrapperExeDir Condition=" Exists('$(PaketBootStrapperExePath)') " >$([System.IO.Path]::GetDirectoryName("$(PaketBootStrapperExePath)"))\</PaketBootStrapperExeDir>
30-
31-
<PaketBootStrapperCommand Condition=" '$(OS)' == 'Windows_NT'">"$(PaketBootStrapperExePath)"</PaketBootStrapperCommand>
30+
31+
<PaketBootStrapperCommand Condition=" '$(OS)' == 'Windows_NT' ">"$(PaketBootStrapperExePath)"</PaketBootStrapperCommand>
3232
<PaketBootStrapperCommand Condition=" '$(OS)' != 'Windows_NT' ">$(MonoPath) --runtime=v4.0.30319 "$(PaketBootStrapperExePath)"</PaketBootStrapperCommand>
3333

34-
<!-- Disable automagic references for F# dotnet sdk -->
34+
<!-- Disable automagic references for F# DotNet SDK -->
3535
<!-- This will not do anything for other project types -->
3636
<!-- see https://github.com/fsharp/fslang-design/blob/master/tooling/FST-1002-fsharp-in-dotnet-sdk.md -->
3737
<DisableImplicitFSharpCoreReference>true</DisableImplicitFSharpCoreReference>
@@ -40,55 +40,68 @@
4040
<!-- Disable Paket restore under NCrunch build -->
4141
<PaketRestoreDisabled Condition="'$(NCrunch)' == '1'">True</PaketRestoreDisabled>
4242

43+
<!-- Disable test for CLI tool completely - overrideable via properties in projects or via environment variables -->
44+
<PaketDisableCliTest Condition=" '$(PaketDisableCliTest)' == '' ">False</PaketDisableCliTest>
45+
4346
<PaketIntermediateOutputPath Condition=" '$(PaketIntermediateOutputPath)' == '' ">$(BaseIntermediateOutputPath.TrimEnd('\').TrimEnd('\/'))</PaketIntermediateOutputPath>
4447
</PropertyGroup>
4548

46-
<!-- Check if paket is available as local dotnet cli tool -->
49+
<!-- Resolve how paket should be called -->
50+
<!-- Current priority is: local (1: repo root, 2: .paket folder) => 3: as CLI tool => as bootstrapper (4: proj Bootstrapper style, 5: BootstrapperExeDir) => 6: global path variable -->
4751
<Target Name="SetPaketCommand" >
48-
49-
<!-- Call 'dotnet paket' and see if it returns without an error. Mute all the output. -->
50-
<Exec Command="dotnet paket --version" IgnoreExitCode="true" StandardOutputImportance="low" StandardErrorImportance="low" >
51-
<Output TaskParameter="ExitCode" PropertyName="LocalPaketToolExitCode" />
52-
</Exec>
52+
<!-- Test if paket is available in the standard locations. If so, that takes priority. Case 1/2 - non-windows specific -->
53+
<PropertyGroup Condition=" '$(OS)' != 'Windows_NT' ">
54+
<!-- no windows, try native paket as default, root => tool -->
55+
<PaketExePath Condition=" '$(PaketExePath)' == '' AND Exists('$(PaketRootPath)paket') ">$(PaketRootPath)paket</PaketExePath>
56+
<PaketExePath Condition=" '$(PaketExePath)' == '' AND Exists('$(PaketToolsPath)paket') ">$(PaketToolsPath)paket</PaketExePath>
57+
</PropertyGroup>
5358

54-
<!-- If local paket tool is found, use that -->
55-
<PropertyGroup Condition=" '$(LocalPaketToolExitCode)' == '0' ">
56-
<InternalPaketCommand>dotnet paket</InternalPaketCommand>
59+
<!-- Test if paket is available in the standard locations. If so, that takes priority. Case 2/2 - same across platforms -->
60+
<PropertyGroup>
61+
<!-- root => tool -->
62+
<PaketExePath Condition=" '$(PaketExePath)' == '' AND Exists('$(PaketRootPath)paket.exe') ">$(PaketRootPath)paket.exe</PaketExePath>
63+
<PaketExePath Condition=" '$(PaketExePath)' == '' AND Exists('$(PaketToolsPath)paket.exe') ">$(PaketToolsPath)paket.exe</PaketExePath>
5764
</PropertyGroup>
5865

59-
<!-- If not, then we go through our normal steps of setting the Paket command. -->
60-
<PropertyGroup Condition=" '$(LocalPaketToolExitCode)' != '0' ">
61-
<!-- windows, root => tool => proj style => bootstrapper => global -->
62-
<PaketExePath Condition=" '$(PaketExePath)' == '' AND '$(OS)' == 'Windows_NT' AND Exists('$(PaketRootPath)paket.exe') ">$(PaketRootPath)paket.exe</PaketExePath>
63-
<PaketExePath Condition=" '$(PaketExePath)' == '' AND '$(OS)' == 'Windows_NT' AND Exists('$(PaketToolsPath)paket.exe') ">$(PaketToolsPath)paket.exe</PaketExePath>
64-
<PaketExePath Condition=" '$(PaketExePath)' == '' AND '$(OS)' == 'Windows_NT' AND '$(PaketBootstrapperStyle)' == 'proj' ">$(PaketToolsPath)paket.exe</PaketExePath>
65-
<PaketExePath Condition=" '$(PaketExePath)' == '' AND '$(OS)' == 'Windows_NT' AND Exists('$(PaketBootStrapperExeDir)') ">$(_PaketBootStrapperExeDir)paket.exe</PaketExePath>
66-
<PaketExePath Condition=" '$(PaketExePath)' == '' AND '$(OS)' == 'Windows_NT' ">paket.exe</PaketExePath>
66+
<!-- If paket hasn't be found in standard locations, test for CLI tool usage. -->
67+
<!-- First test: Is CLI configured to be used in "dotnet-tools.json"? - can result in a false negative; only a positive outcome is reliable. -->
68+
<PropertyGroup Condition=" '$(PaketExePath)' == '' ">
69+
<_DotnetToolsJson Condition="Exists('$(PaketRootPath)/.config/dotnet-tools.json')">$([System.IO.File]::ReadAllText("$(PaketRootPath)/.config/dotnet-tools.json"))</_DotnetToolsJson>
70+
<_ConfigContainsPaket Condition=" '$(_DotnetToolsJson)' != ''">$(_DotnetToolsJson.Contains('"paket"'))</_ConfigContainsPaket>
71+
<_ConfigContainsPaket Condition=" '$(_ConfigContainsPaket)' == ''">false</_ConfigContainsPaket>
72+
</PropertyGroup>
6773

68-
<!-- no windows, try native paket as default, root => tool => proj style => mono paket => bootstrpper => global -->
69-
<PaketExePath Condition=" '$(PaketExePath)' == '' AND '$(OS)' != 'Windows_NT' AND Exists('$(PaketRootPath)paket') ">$(PaketRootPath)paket</PaketExePath>
70-
<PaketExePath Condition=" '$(PaketExePath)' == '' AND '$(OS)' != 'Windows_NT' AND Exists('$(PaketToolsPath)paket') ">$(PaketToolsPath)paket</PaketExePath>
71-
<PaketExePath Condition=" '$(PaketExePath)' == '' AND '$(OS)' != 'Windows_NT' AND '$(PaketBootstrapperStyle)' == 'proj' ">$(PaketToolsPath)paket</PaketExePath>
74+
<!-- Second test: Call 'dotnet paket' and see if it returns without an error. Mute all the output. Only run if previous test failed and the test has not been disabled. -->
75+
<!-- WARNING: This method can lead to processes hanging forever, and should be used as little as possible. See https://github.com/fsprojects/Paket/issues/3705 for details. -->
76+
<Exec Condition=" '$(PaketExePath)' == '' AND !$(PaketDisableCliTest) AND !$(_ConfigContainsPaket)" Command="dotnet paket --version" IgnoreExitCode="true" StandardOutputImportance="low" StandardErrorImportance="low" >
77+
<Output TaskParameter="ExitCode" PropertyName="LocalPaketToolExitCode" />
78+
</Exec>
7279

73-
<!-- no windows, try mono paket -->
74-
<PaketExePath Condition=" '$(PaketExePath)' == '' AND '$(OS)' != 'Windows_NT' AND Exists('$(PaketRootPath)paket.exe') ">$(PaketRootPath)paket.exe</PaketExePath>
75-
<PaketExePath Condition=" '$(PaketExePath)' == '' AND '$(OS)' != 'Windows_NT' AND Exists('$(PaketToolsPath)paket.exe') ">$(PaketToolsPath)paket.exe</PaketExePath>
80+
<!-- If paket is installed as CLI use that. Again, only if paket haven't already been found in standard locations. -->
81+
<PropertyGroup Condition=" '$(PaketExePath)' == '' AND ($(_ConfigContainsPaket) OR '$(LocalPaketToolExitCode)' == '0') ">
82+
<_PaketCommand>dotnet paket</_PaketCommand>
83+
</PropertyGroup>
7684

77-
<!-- no windows, try bootstrapper -->
78-
<PaketExePath Condition=" '$(PaketExePath)' == '' AND '$(OS)' != 'Windows_NT' AND Exists('$(PaketBootStrapperExeDir)') ">$(PaketBootStrapperExeDir)paket.exe</PaketExePath>
85+
<!-- If neither local files nor CLI tool can be found, final attempt is searching for boostrapper config before falling back to global path variable. -->
86+
<PropertyGroup Condition=" '$(PaketExePath)' == '' AND '$(_PaketCommand)' == '' ">
87+
<!-- Test for bootstrapper setup -->
88+
<PaketExePath Condition=" '$(PaketExePath)' == '' AND '$(PaketBootstrapperStyle)' == 'proj' ">$(PaketToolsPath)paket</PaketExePath>
89+
<PaketExePath Condition=" '$(PaketExePath)' == '' AND Exists('$(PaketBootStrapperExeDir)') ">$(PaketBootStrapperExeDir)paket</PaketExePath>
7990

80-
<!-- no windows, try global native paket -->
81-
<PaketExePath Condition=" '$(PaketExePath)' == '' AND '$(OS)' != 'Windows_NT' ">paket</PaketExePath>
91+
<!-- If all else fails, use global path approach. -->
92+
<PaketExePath Condition=" '$(PaketExePath)' == ''">paket</PaketExePath>
93+
</PropertyGroup>
8294

95+
<!-- If not using CLI, setup correct execution command. -->
96+
<PropertyGroup Condition=" '$(_PaketCommand)' == '' ">
8397
<_PaketExeExtension>$([System.IO.Path]::GetExtension("$(PaketExePath)"))</_PaketExeExtension>
84-
<InternalPaketCommand Condition=" '$(InternalPaketCommand)' == '' AND '$(_PaketExeExtension)' == '.dll' ">dotnet "$(PaketExePath)"</InternalPaketCommand>
85-
<InternalPaketCommand Condition=" '$(InternalPaketCommand)' == '' AND '$(OS)' != 'Windows_NT' AND '$(_PaketExeExtension)' == '.exe' ">$(MonoPath) --runtime=v4.0.30319 "$(PaketExePath)"</InternalPaketCommand>
86-
<InternalPaketCommand Condition=" '$(InternalPaketCommand)' == '' ">"$(PaketExePath)"</InternalPaketCommand>
87-
98+
<_PaketCommand Condition=" '$(_PaketCommand)' == '' AND '$(_PaketExeExtension)' == '.dll' ">dotnet "$(PaketExePath)"</_PaketCommand>
99+
<_PaketCommand Condition=" '$(_PaketCommand)' == '' AND '$(OS)' != 'Windows_NT' AND '$(_PaketExeExtension)' == '.exe' ">$(MonoPath) --runtime=v4.0.30319 "$(PaketExePath)"</_PaketCommand>
100+
<_PaketCommand Condition=" '$(_PaketCommand)' == '' ">"$(PaketExePath)"</_PaketCommand>
88101
</PropertyGroup>
89102

90103
<!-- The way to get a property to be available outside the target is to use this task. -->
91-
<CreateProperty Value="$(InternalPaketCommand)">
104+
<CreateProperty Value="$(_PaketCommand)">
92105
<Output TaskParameter="Value" PropertyName="PaketCommand"/>
93106
</CreateProperty>
94107

@@ -123,7 +136,7 @@
123136
<!-- Parse our simple 'paket.restore.cached' json ...-->
124137
<PaketRestoreCachedSplitObject Include="$([System.Text.RegularExpressions.Regex]::Split(`$(PaketRestoreCachedContents)`, `{|}|,`))"></PaketRestoreCachedSplitObject>
125138
<!-- Keep Key, Value ItemGroup-->
126-
<PaketRestoreCachedKeyValue Include="@(PaketRestoreCachedSplitObject)"
139+
<PaketRestoreCachedKeyValue Include="@(PaketRestoreCachedSplitObject)"
127140
Condition=" $([System.Text.RegularExpressions.Regex]::Split(`%(Identity)`, `&quot;: &quot;`).Length) &gt; 1 ">
128141
<Key>$([System.Text.RegularExpressions.Regex]::Split(`%(Identity)`, `": "`)[0].Replace(`"`, ``).Replace(` `, ``))</Key>
129142
<Value>$([System.Text.RegularExpressions.Regex]::Split(`%(Identity)`, `": "`)[1].Replace(`"`, ``).Replace(` `, ``))</Value>
@@ -156,7 +169,7 @@
156169
<Exec Command='$(PaketBootStrapperCommand)' Condition=" '$(PaketBootstrapperStyle)' == 'classic' AND Exists('$(PaketBootStrapperExePath)') AND !(Exists('$(PaketExePath)'))" ContinueOnError="false" />
157170
<Error Text="Stop build because of PAKET_ERROR_ON_MSBUILD_EXEC and we need a full restore (hashes don't match)" Condition=" '$(PAKET_ERROR_ON_MSBUILD_EXEC)' == 'true' AND '$(PaketRestoreRequired)' == 'true' AND '$(PaketDisableGlobalRestore)' != 'true'" />
158171
<Exec Command='$(PaketCommand) restore' Condition=" '$(PaketRestoreRequired)' == 'true' AND '$(PaketDisableGlobalRestore)' != 'true' " ContinueOnError="false" />
159-
172+
160173
<!-- Step 2 Detect project specific changes -->
161174
<ItemGroup>
162175
<MyTargetFrameworks Condition="'$(TargetFramework)' != '' " Include="$(TargetFramework)"></MyTargetFrameworks>

Saturn.sln

+15
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Saturn.Extensions.OpenIdCon
4545
EndProject
4646
Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "AzureADAuthSample", "sample\AzureADAuthSample\AzureADAuthSample.fsproj", "{E26F4220-6A5C-49F8-8DA1-9BC7FBFCBA36}"
4747
EndProject
48+
Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Saturn.LiveView", "src\Saturn.LiveView\Saturn.LiveView.fsproj", "{1F68DB09-7A15-4D86-822D-5D9F62FE1372}"
49+
EndProject
4850
Global
4951
GlobalSection(SolutionConfigurationPlatforms) = preSolution
5052
Debug|Any CPU = Debug|Any CPU
@@ -274,6 +276,18 @@ Global
274276
{E26F4220-6A5C-49F8-8DA1-9BC7FBFCBA36}.Release|x64.Build.0 = Release|Any CPU
275277
{E26F4220-6A5C-49F8-8DA1-9BC7FBFCBA36}.Release|x86.ActiveCfg = Release|Any CPU
276278
{E26F4220-6A5C-49F8-8DA1-9BC7FBFCBA36}.Release|x86.Build.0 = Release|Any CPU
279+
{1F68DB09-7A15-4D86-822D-5D9F62FE1372}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
280+
{1F68DB09-7A15-4D86-822D-5D9F62FE1372}.Debug|Any CPU.Build.0 = Debug|Any CPU
281+
{1F68DB09-7A15-4D86-822D-5D9F62FE1372}.Debug|x64.ActiveCfg = Debug|Any CPU
282+
{1F68DB09-7A15-4D86-822D-5D9F62FE1372}.Debug|x64.Build.0 = Debug|Any CPU
283+
{1F68DB09-7A15-4D86-822D-5D9F62FE1372}.Debug|x86.ActiveCfg = Debug|Any CPU
284+
{1F68DB09-7A15-4D86-822D-5D9F62FE1372}.Debug|x86.Build.0 = Debug|Any CPU
285+
{1F68DB09-7A15-4D86-822D-5D9F62FE1372}.Release|Any CPU.ActiveCfg = Release|Any CPU
286+
{1F68DB09-7A15-4D86-822D-5D9F62FE1372}.Release|Any CPU.Build.0 = Release|Any CPU
287+
{1F68DB09-7A15-4D86-822D-5D9F62FE1372}.Release|x64.ActiveCfg = Release|Any CPU
288+
{1F68DB09-7A15-4D86-822D-5D9F62FE1372}.Release|x64.Build.0 = Release|Any CPU
289+
{1F68DB09-7A15-4D86-822D-5D9F62FE1372}.Release|x86.ActiveCfg = Release|Any CPU
290+
{1F68DB09-7A15-4D86-822D-5D9F62FE1372}.Release|x86.Build.0 = Release|Any CPU
277291
EndGlobalSection
278292
GlobalSection(NestedProjects) = preSolution
279293
{8DBA089A-7C24-4E87-870B-E0774654F376} = {F2C8C347-845F-42E4-A702-7381C4B4087F}
@@ -294,5 +308,6 @@ Global
294308
{8D89C30B-FF70-4906-A0E3-122B33CF568C} = {511FB392-5714-4028-97F3-F883F81B43DB}
295309
{E4420975-2F85-4F2B-915D-9B957B376A96} = {F2C8C347-845F-42E4-A702-7381C4B4087F}
296310
{E26F4220-6A5C-49F8-8DA1-9BC7FBFCBA36} = {511FB392-5714-4028-97F3-F883F81B43DB}
311+
{1F68DB09-7A15-4D86-822D-5D9F62FE1372} = {F2C8C347-845F-42E4-A702-7381C4B4087F}
297312
EndGlobalSection
298313
EndGlobal

paket.dependencies

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ nuget Newtonsoft.Json
99
nuget NSubstitute
1010
nuget protobuf-net.Grpc.HttpClient
1111
nuget System.Threading.Tasks.Dataflow >= 4.9
12+
nuget Elmish
1213

1314
group netstandard2.0
1415
source https://api.nuget.org/v3/index.json

paket.lock

+2
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ NUGET
1313
System.Reflection.Emit (>= 4.3)
1414
System.Reflection.TypeExtensions (>= 4.3)
1515
System.Xml.XmlDocument (>= 4.3)
16+
Elmish (3.0.6)
17+
FSharp.Core (>= 4.6.2)
1618
Expecto (9.0)
1719
FSharp.Core (>= 4.6)
1820
Mono.Cecil (>= 0.11.2)

0 commit comments

Comments
 (0)