Skip to content

Commit 0e2ffa6

Browse files
committed
Add support for linked files
Now you can have a single project, linking files from arbitrary locations for the purpose of F5 debugging from VS!
1 parent 27c9cb6 commit 0e2ffa6

File tree

1 file changed

+59
-1
lines changed

1 file changed

+59
-1
lines changed

src/SmallSharp/SmallSharp.targets

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
<StartupFile Condition="'$(StartupFile)' == ''">$(S)</StartupFile>
1515
<StartupFile Condition="'$(StartupFile)' == ''">$(ActiveDebugProfile)</StartupFile>
1616
<FindStartupFile Condition="'$(StartupFile)' == '' or !Exists('$(StartupFile)')">true</FindStartupFile>
17-
<StartupFileDependsOn>EnsureProperties;CollectStartupFile;SelectStartupFile;SelectTopLevelCompile;UpdateLaunchSettings;EmitTargets</StartupFileDependsOn>
17+
<StartupFileDependsOn>EnsureProperties;CollectStartupFile;ResolveStartupFile;SelectStartupFile;SelectTopLevelCompile;UpdateLaunchSettings;EmitTargets</StartupFileDependsOn>
1818

1919
<!-- For CLI dotnet run, users must set ImportProjectExtensionProps/ImportProjectExtensionTargets=true -->
2020
<SmallSharpPackagesProps>$(MSBuildProjectExtensionsPath)$(MSBuildProjectFile).smallsharp.props</SmallSharpPackagesProps>
@@ -25,10 +25,19 @@
2525
<!-- Ensures all top-level files show up in the IDE -->
2626
<None Include="*.cs" Exclude="$(ActiveDebugProfile);$(ActiveFile)" />
2727
<Compile Remove="*.cs" />
28+
2829
<!-- Ensure changes we make to this file trigger a new DTB -->
2930
<UpToDateCheckBuilt Include="Properties\launchSettings.json" />
3031
<UpToDateCheckBuilt Include="$(SmallSharpPackagesProps);$(SmallSharpPackagesTargets)" />
3132
<Compile Update="@(Compile -> WithMetadataValue('NuGetPackageId', 'SmallSharp'))" Visible="false" />
33+
34+
<!-- Include linked compile files too -->
35+
<_LinkedCompile Include="@(Compile -> HasMetadata('Link'))" />
36+
<_NuGetLinked Include="@(_LinkedCompile -> HasMetadata('NuGetPackageId'))" />
37+
<_NoNuGetLinked Include="@(_LinkedCompile)" Exclude="@(_NuGetLinked)" />
38+
<LinkedCompile Include="@(_NoNuGetLinked -> WithoutMetadataValue('Visible', 'false'))" />
39+
<Compile Remove="@(LinkedCompile -> WithoutMetadataValue('Link', '$(ActiveDebugProfile)'))" />
40+
<None Include="@(LinkedCompile -> WithoutMetadataValue('Link', '$(ActiveFile)'))" />
3241
</ItemGroup>
3342

3443
<!-- When restoring, if we include the source files, we'd get duplicate references. -->
@@ -51,7 +60,19 @@
5160
<Target Name="CollectStartupFile">
5261
<ItemGroup>
5362
<StartupFile Include="*.cs" />
63+
<StartupFile Include="@(LinkedCompile)" />
64+
</ItemGroup>
65+
</Target>
66+
67+
<Target Name="ResolveStartupFile" Condition="'$(FindStartupFile)' == 'true'">
68+
<ItemGroup>
69+
<!-- Find if the specified StartupFile is a filename that matches an available StartupFile item -->
70+
<_MatchingStartupFile Include="@(StartupFile)" Condition="'$(StartupFile)' != '' and '%(Filename)%(Extension)' == '$(StartupFile)'" />
5471
</ItemGroup>
72+
<PropertyGroup Condition="'@(_MatchingStartupFile)' != ''">
73+
<StartupFile>@(_MatchingStartupFile -> '%(Identity)')</StartupFile>
74+
<FindStartupFile>false</FindStartupFile>
75+
</PropertyGroup>
5576
</Target>
5677

5778
<!-- Defaults the startup file to the first Compile, if none previously selected. -->
@@ -146,6 +167,8 @@
146167
<!-- We remove all top-level from Compile because copy/pasting startup files may end up
147168
causing those items to be hardcoded in the .csproj -->
148169
<Compile Remove="@(Compile -> WithMetadataValue('RelativeDir', ''))" />
170+
<!-- Remove linked compile files too -->
171+
<Compile Remove="@(Compile -> HasMetadata('Link'))" />
149172
<Compile Include="$(StartupFile)" Condition="'$(StartupFile)' != '' and Exists('$(StartupFile)')" />
150173
<UpToDateCheckInput Include="$(StartupFile)" Condition="'$(StartupFile)' != '' and Exists('$(StartupFile)')" />
151174
</ItemGroup>
@@ -202,4 +225,39 @@
202225
</Task>
203226
</UsingTask>
204227

228+
<UsingTask TaskName="DumpItems" TaskFactory="RoslynCodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.Core.dll">
229+
<ParameterGroup>
230+
<Items ParameterType="Microsoft.Build.Framework.ITaskItem[]" Required="true" />
231+
<ItemName />
232+
</ParameterGroup>
233+
<Task>
234+
<Using Namespace="Microsoft.Build.Framework" />
235+
<Using Namespace="Microsoft.Build.Utilities" />
236+
<Using Namespace="System" />
237+
<Using Namespace="System.Linq" />
238+
<Code Type="Fragment" Language="cs">
239+
<![CDATA[
240+
var itemName = ItemName ?? "Item";
241+
if (Items.Length == 0)
242+
Log.LogMessage(MessageImportance.High, "No {0} items received to dump.", ItemName ?? "");
243+
else
244+
Log.LogMessage(MessageImportance.High, "Dumping {0} {1} items.", Items.Length, ItemName ?? "");
245+
246+
foreach (var item in Items.OrderBy(i => i.ItemSpec))
247+
{
248+
Log.LogMessage(MessageImportance.High, "{0}: {1}", itemName, item.ItemSpec);
249+
foreach (var name in item.MetadataNames.OfType<string>().OrderBy(_ => _))
250+
{
251+
try
252+
{
253+
Log.LogMessage(MessageImportance.High, "\t{0}={1}", name, item.GetMetadata(name));
254+
}
255+
catch { }
256+
}
257+
}
258+
]]>
259+
</Code>
260+
</Task>
261+
</UsingTask>
262+
205263
</Project>

0 commit comments

Comments
 (0)