Skip to content

Commit a6849cd

Browse files
committed
Look for TargetFramework being set in C# file
1 parent 619f885 commit a6849cd

File tree

4 files changed

+95
-18
lines changed

4 files changed

+95
-18
lines changed

src/Amazon.Lambda.Tools/Commands/DeployFunctionCommand.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@ protected override async Task<bool> PerformActionAsync()
257257
{
258258
if (Utilities.IsSingleFileCSharpFile(projectLocation))
259259
{
260-
targetFramework = LambdaUtilities.DetermineTargetFrameworkForSingleFile(lambdaRuntime);
260+
targetFramework = LambdaUtilities.DetermineTargetFrameworkForSingleFile(projectLocation, lambdaRuntime);
261261
}
262262
else
263263
{

src/Amazon.Lambda.Tools/Commands/PackageCommand.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,7 @@ protected override async Task<bool> PerformActionAsync()
233233
{
234234
if (Utilities.IsSingleFileCSharpFile(projectLocation))
235235
{
236-
targetFramework = LambdaUtilities.DetermineTargetFrameworkForSingleFile(null);
236+
targetFramework = LambdaUtilities.DetermineTargetFrameworkForSingleFile(projectLocation, null);
237237
}
238238
else
239239
{

src/Amazon.Lambda.Tools/LambdaUtilities.cs

Lines changed: 45 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,22 @@
1-
using System;
1+
using Amazon.Common.DotNetCli.Tools;
2+
using Amazon.Lambda.Model;
3+
using Amazon.S3;
4+
using Amazon.S3.Model;
5+
using Amazon.SecurityToken;
6+
using Newtonsoft.Json;
7+
using Newtonsoft.Json.Linq;
8+
using System;
29
using System.Collections.Generic;
310
using System.IO;
411
using System.Linq;
12+
using System.Runtime.InteropServices;
513
using System.Text.Json;
6-
using YamlDotNet.RepresentationModel;
7-
using Newtonsoft.Json;
8-
using Newtonsoft.Json.Linq;
9-
using System.Xml.Linq;
10-
using Amazon.Common.DotNetCli.Tools;
11-
12-
using Amazon.Lambda.Model;
13-
using Amazon.S3;
14-
using Amazon.S3.Model;
14+
using System.Text.RegularExpressions;
1515
using System.Threading.Tasks;
16+
using System.Xml.Linq;
1617
using System.Xml.XPath;
18+
using YamlDotNet.RepresentationModel;
1719
using Environment = System.Environment;
18-
using Amazon.SecurityToken;
19-
using System.Runtime.InteropServices;
2020

2121
namespace Amazon.Lambda.Tools
2222
{
@@ -83,16 +83,45 @@ public static string DetermineLambdaRuntimeFromTargetFramework(string targetFram
8383
return kvp.Key;
8484
}
8585

86-
public static string DetermineTargetFrameworkForSingleFile(string lambdaRuntime)
86+
public static string DetermineTargetFrameworkForSingleFile(string filePath, string lambdaRuntime)
8787
{
88-
string targetFramework;
88+
return DetermineTargetFrameworkForSingleFile(File.ReadAllLines(filePath), lambdaRuntime);
89+
}
90+
91+
public static string DetermineTargetFrameworkForSingleFile(string[] lines, string lambdaRuntime)
92+
{
93+
string targetFramework = null;
8994
if (lambdaRuntime != null && _lambdaRuntimeToDotnetFramework.TryGetValue(lambdaRuntime, out targetFramework))
9095
{
9196
return targetFramework;
9297
}
9398

94-
// TODO: Figure out what to do when we don't have a lambdaRuntime to base it on.
95-
targetFramework = "net10.0";
99+
// Look for an in-file directive that starts with "#:property" and contains "TargetFramework=<value>"
100+
// Allow extra spaces but the directive must begin with "#:property". Extract the value after '='.
101+
if (lines != null && lines.Length > 0)
102+
{
103+
// Pattern explanation:
104+
// ^\s* -> optional leading whitespace
105+
// #\s*:\s*property -> literal "#", optional spaces, ":", optional spaces, "property"
106+
// \s+ -> at least one space (separates property from key)
107+
// TargetFramework -> literal key
108+
// \s*=\s* -> equals with optional surrounding spaces
109+
// (\S+) -> capture the value (non-whitespace sequence)
110+
var directiveRegex = new Regex(@"^\s*#\s*:\s*property\s+TargetFramework\s*=\s*(\S+)", RegexOptions.IgnoreCase);
111+
112+
foreach (var rawLine in lines)
113+
{
114+
if (string.IsNullOrWhiteSpace(rawLine))
115+
continue;
116+
117+
var m = directiveRegex.Match(rawLine);
118+
if (m.Success && m.Groups.Count > 1)
119+
{
120+
targetFramework = m.Groups[1].Value.Trim();
121+
break;
122+
}
123+
}
124+
}
96125

97126
return targetFramework;
98127
}

test/Amazon.Lambda.Tools.Test/LambdaSingleFilePackageTests.cs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,5 +298,53 @@ public void GetSolutionDirectoryWithExplicitSolutionDirectory()
298298
var solutionDirectory = Utilities.GetSolutionDirectoryFullPath(Environment.CurrentDirectory, projectLocation, givenSolutionDirectory);
299299
Assert.Equal(givenSolutionDirectory, solutionDirectory);
300300
}
301+
302+
[Fact]
303+
public void DetermineTargetFrameworkForSingleFile_FindsExactDirective()
304+
{
305+
var lines = new[] { "#:property TargetFramework=net10.0" };
306+
var result = LambdaUtilities.DetermineTargetFrameworkForSingleFile(lines, null);
307+
Assert.Equal("net10.0", result);
308+
}
309+
310+
[Fact]
311+
public void DetermineTargetFrameworkForSingleFile_FindsDirectiveWithExtraSpaces()
312+
{
313+
var lines = new[] { "#:property TargetFramework=net11.0" };
314+
var result = LambdaUtilities.DetermineTargetFrameworkForSingleFile(lines, null);
315+
Assert.Equal("net11.0", result);
316+
}
317+
318+
[Fact]
319+
public void DetermineTargetFrameworkForSingleFile_FindsDirectiveWithSpacesAroundEquals()
320+
{
321+
var lines = new[] { "#:property TargetFramework = net12.0" };
322+
var result = LambdaUtilities.DetermineTargetFrameworkForSingleFile(lines, null);
323+
Assert.Equal("net12.0", result);
324+
}
325+
326+
[Fact]
327+
public void DetermineTargetFrameworkForSingleFile_CommentedOut()
328+
{
329+
var lines = new[] { "//#:property TargetFramework=NET13.0" };
330+
var result = LambdaUtilities.DetermineTargetFrameworkForSingleFile(lines, null);
331+
Assert.Null(result);
332+
}
333+
334+
[Fact]
335+
public void DetermineTargetFrameworkForSingleFile_WithLambdaRuntime()
336+
{
337+
var lines = new[] { "// Nothing to see here" };
338+
var result = LambdaUtilities.DetermineTargetFrameworkForSingleFile(lines, "dotnet10");
339+
Assert.Equal("net10.0", result);
340+
}
341+
342+
[Fact]
343+
public void DetermineTargetFrameworkForSingleFile_NoDirectiveReturnsNull()
344+
{
345+
var lines = new[] { "// just a comment", "using System;" };
346+
var result = LambdaUtilities.DetermineTargetFrameworkForSingleFile(lines, null);
347+
Assert.Null(result);
348+
}
301349
}
302350
}

0 commit comments

Comments
 (0)