|
20 | 20 | <PaketBootstrapperStyle Condition="Exists('$(PaketToolsPath)paket.bootstrapper.proj')">proj</PaketBootstrapperStyle>
|
21 | 21 | <PaketExeImage>assembly</PaketExeImage>
|
22 | 22 | <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> |
24 | 24 | <MonoPath Condition="'$(MonoPath)' == ''">mono</MonoPath>
|
25 | 25 |
|
26 | 26 | <!-- PaketBootStrapper -->
|
27 | 27 | <PaketBootStrapperExePath Condition=" '$(PaketBootStrapperExePath)' == '' AND Exists('$(PaketRootPath)paket.bootstrapper.exe')">$(PaketRootPath)paket.bootstrapper.exe</PaketBootStrapperExePath>
|
28 | 28 | <PaketBootStrapperExePath Condition=" '$(PaketBootStrapperExePath)' == '' ">$(PaketToolsPath)paket.bootstrapper.exe</PaketBootStrapperExePath>
|
29 | 29 | <PaketBootStrapperExeDir Condition=" Exists('$(PaketBootStrapperExePath)') " >$([System.IO.Path]::GetDirectoryName("$(PaketBootStrapperExePath)"))\</PaketBootStrapperExeDir>
|
30 | 30 |
|
31 |
| - <PaketBootStrapperCommand Condition=" '$(OS)' == 'Windows_NT'">"$(PaketBootStrapperExePath)"</PaketBootStrapperCommand> |
| 31 | + <PaketBootStrapperCommand Condition=" '$(OS)' == 'Windows_NT' ">"$(PaketBootStrapperExePath)"</PaketBootStrapperCommand> |
32 | 32 | <PaketBootStrapperCommand Condition=" '$(OS)' != 'Windows_NT' ">$(MonoPath) --runtime=v4.0.30319 "$(PaketBootStrapperExePath)"</PaketBootStrapperCommand>
|
33 | 33 |
|
34 |
| - <!-- Disable automagic references for F# dotnet sdk --> |
35 |
| - <!-- This will not do anything for other project types --> |
36 |
| - <!-- see https://github.com/fsharp/fslang-design/blob/master/tooling/FST-1002-fsharp-in-dotnet-sdk.md --> |
37 |
| - <DisableImplicitFSharpCoreReference>true</DisableImplicitFSharpCoreReference> |
38 |
| - <DisableImplicitSystemValueTupleReference>true</DisableImplicitSystemValueTupleReference> |
39 |
| - |
40 | 34 | <!-- Disable Paket restore under NCrunch build -->
|
41 | 35 | <PaketRestoreDisabled Condition="'$(NCrunch)' == '1'">True</PaketRestoreDisabled>
|
42 | 36 |
|
| 37 | + <!-- Disable test for CLI tool completely - overrideable via properties in projects or via environment variables --> |
| 38 | + <PaketDisableCliTest Condition=" '$(PaketDisableCliTest)' == '' ">False</PaketDisableCliTest> |
| 39 | + |
43 | 40 | <PaketIntermediateOutputPath Condition=" '$(PaketIntermediateOutputPath)' == '' ">$(BaseIntermediateOutputPath.TrimEnd('\').TrimEnd('\/'))</PaketIntermediateOutputPath>
|
44 | 41 | </PropertyGroup>
|
45 | 42 |
|
46 |
| - <!-- Check if paket is available as local dotnet cli tool --> |
| 43 | + <!-- Resolve how paket should be called --> |
| 44 | + <!-- 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 --> |
47 | 45 | <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> |
| 46 | + <!-- Test if paket is available in the standard locations. If so, that takes priority. Case 1/2 - non-windows specific --> |
| 47 | + <PropertyGroup Condition=" '$(OS)' != 'Windows_NT' "> |
| 48 | + <!-- no windows, try native paket as default, root => tool --> |
| 49 | + <PaketExePath Condition=" '$(PaketExePath)' == '' AND Exists('$(PaketRootPath)paket') ">$(PaketRootPath)paket</PaketExePath> |
| 50 | + <PaketExePath Condition=" '$(PaketExePath)' == '' AND Exists('$(PaketToolsPath)paket') ">$(PaketToolsPath)paket</PaketExePath> |
| 51 | + </PropertyGroup> |
53 | 52 |
|
54 |
| - <!-- If local paket tool is found, use that --> |
55 |
| - <PropertyGroup Condition=" '$(LocalPaketToolExitCode)' == '0' "> |
56 |
| - <InternalPaketCommand>dotnet paket</InternalPaketCommand> |
| 53 | + <!-- Test if paket is available in the standard locations. If so, that takes priority. Case 2/2 - same across platforms --> |
| 54 | + <PropertyGroup> |
| 55 | + <!-- root => tool --> |
| 56 | + <PaketExePath Condition=" '$(PaketExePath)' == '' AND Exists('$(PaketRootPath)paket.exe') ">$(PaketRootPath)paket.exe</PaketExePath> |
| 57 | + <PaketExePath Condition=" '$(PaketExePath)' == '' AND Exists('$(PaketToolsPath)paket.exe') ">$(PaketToolsPath)paket.exe</PaketExePath> |
57 | 58 | </PropertyGroup>
|
58 | 59 |
|
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> |
| 60 | + <!-- If paket hasn't be found in standard locations, test for CLI tool usage. --> |
| 61 | + <!-- First test: Is CLI configured to be used in "dotnet-tools.json"? - can result in a false negative; only a positive outcome is reliable. --> |
| 62 | + <PropertyGroup Condition=" '$(PaketExePath)' == '' "> |
| 63 | + <_DotnetToolsJson Condition="Exists('$(PaketRootPath)/.config/dotnet-tools.json')">$([System.IO.File]::ReadAllText("$(PaketRootPath)/.config/dotnet-tools.json"))</_DotnetToolsJson> |
| 64 | + <_ConfigContainsPaket Condition=" '$(_DotnetToolsJson)' != ''">$(_DotnetToolsJson.Contains('"paket"'))</_ConfigContainsPaket> |
| 65 | + <_ConfigContainsPaket Condition=" '$(_ConfigContainsPaket)' == ''">false</_ConfigContainsPaket> |
| 66 | + </PropertyGroup> |
67 | 67 |
|
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> |
| 68 | + <!-- 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. --> |
| 69 | + <!-- 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. --> |
| 70 | + <Exec Condition=" '$(PaketExePath)' == '' AND !$(PaketDisableCliTest) AND !$(_ConfigContainsPaket)" Command="dotnet paket --version" IgnoreExitCode="true" StandardOutputImportance="low" StandardErrorImportance="low" > |
| 71 | + <Output TaskParameter="ExitCode" PropertyName="LocalPaketToolExitCode" /> |
| 72 | + </Exec> |
72 | 73 |
|
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> |
| 74 | + <!-- If paket is installed as CLI use that. Again, only if paket haven't already been found in standard locations. --> |
| 75 | + <PropertyGroup Condition=" '$(PaketExePath)' == '' AND ($(_ConfigContainsPaket) OR '$(LocalPaketToolExitCode)' == '0') "> |
| 76 | + <_PaketCommand>dotnet paket</_PaketCommand> |
| 77 | + </PropertyGroup> |
76 | 78 |
|
77 |
| - <!-- no windows, try bootstrapper --> |
78 |
| - <PaketExePath Condition=" '$(PaketExePath)' == '' AND '$(OS)' != 'Windows_NT' AND Exists('$(PaketBootStrapperExeDir)') ">$(PaketBootStrapperExeDir)paket.exe</PaketExePath> |
| 79 | + <!-- If neither local files nor CLI tool can be found, final attempt is searching for boostrapper config before falling back to global path variable. --> |
| 80 | + <PropertyGroup Condition=" '$(PaketExePath)' == '' AND '$(_PaketCommand)' == '' "> |
| 81 | + <!-- Test for bootstrapper setup --> |
| 82 | + <PaketExePath Condition=" '$(PaketExePath)' == '' AND '$(PaketBootstrapperStyle)' == 'proj' ">$(PaketToolsPath)paket</PaketExePath> |
| 83 | + <PaketExePath Condition=" '$(PaketExePath)' == '' AND Exists('$(PaketBootStrapperExeDir)') ">$(PaketBootStrapperExeDir)paket</PaketExePath> |
79 | 84 |
|
80 |
| - <!-- no windows, try global native paket --> |
81 |
| - <PaketExePath Condition=" '$(PaketExePath)' == '' AND '$(OS)' != 'Windows_NT' ">paket</PaketExePath> |
| 85 | + <!-- If all else fails, use global path approach. --> |
| 86 | + <PaketExePath Condition=" '$(PaketExePath)' == ''">paket</PaketExePath> |
| 87 | + </PropertyGroup> |
82 | 88 |
|
| 89 | + <!-- If not using CLI, setup correct execution command. --> |
| 90 | + <PropertyGroup Condition=" '$(_PaketCommand)' == '' "> |
83 | 91 | <_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 |
| - |
| 92 | + <_PaketCommand Condition=" '$(_PaketCommand)' == '' AND '$(_PaketExeExtension)' == '.dll' ">dotnet "$(PaketExePath)"</_PaketCommand> |
| 93 | + <_PaketCommand Condition=" '$(_PaketCommand)' == '' AND '$(OS)' != 'Windows_NT' AND '$(_PaketExeExtension)' == '.exe' ">$(MonoPath) --runtime=v4.0.30319 "$(PaketExePath)"</_PaketCommand> |
| 94 | + <_PaketCommand Condition=" '$(_PaketCommand)' == '' ">"$(PaketExePath)"</_PaketCommand> |
88 | 95 | </PropertyGroup>
|
89 | 96 |
|
90 | 97 | <!-- The way to get a property to be available outside the target is to use this task. -->
|
91 |
| - <CreateProperty Value="$(InternalPaketCommand)"> |
| 98 | + <CreateProperty Value="$(_PaketCommand)"> |
92 | 99 | <Output TaskParameter="Value" PropertyName="PaketCommand"/>
|
93 | 100 | </CreateProperty>
|
94 | 101 |
|
|
0 commit comments