使用C# AWS CDK部署.NET 8项目时引用类库找不到的问题
.NET Lambda + CDK 打包失败排查:构建成功但提示找不到项目
场景重现
目录结构
函数与类库项目路径:
C:\dev\testproj1\apps\func-code\src\LambdaProjectLibrary\LambdaProjectLibrary.csproj C:\dev\testproj1\apps\func-code\src\LambdaProjectFunction\LambdaProjectFunction.csproj C:\dev\testproj1\apps\func-code\src\lambda.sln
CDK项目路径:
C:\dev\testproj1\infra\src\infra.sln C:\dev\testproj1\infra\src\infra\infra.csproj
CDK 配置代码
var buildOption = new BundlingOptions() { Image = Runtime.DOTNET_8.BundlingImage, User = "root", OutputType = BundlingOutput.ARCHIVED, Command = new string[]{ "/bin/sh", "-c", " dotnet tool install -g Amazon.Lambda.Tools"+ " && dotnet build"+ " && dotnet lambda package --output-package /asset-output/function.zip" } }; var function = new Function(this, "LambdaFunc", new FunctionProps { Runtime = Runtime.DOTNET_8, Code = Code.FromAsset("../apps/func-code/src", new Amazon.CDK.AWS.S3.Assets.AssetOptions { Bundling = buildOption }), });
错误日志
运行cdk synth时输出:
Bundling asset testproj1-InfraStack/LambdaFunc/Code/Stage... Skipping NuGet package signature verification. MSBuild version 17.9.4+90725d08d for .NET Determining projects to restore... Restored /asset-input/LambdaProjectLibrary/LambdaProjectLibrary.csproj (in 173 ms). Restored /asset-input/LambdaProjectFunction/LambdaProjectFunction.csproj (in 7.84 sec). LambdaProjectLibrary -> /asset-input/LambdaProjectLibrary/bin/Debug/net8.0/LambdaProjectLibrary.dll LambdaProjectFunction -> /asset-input/LambdaProjectFunction/bin/Debug/net8.0/LambdaProjectFunction.dll Build succeeded. Time Elapsed 00:00:30.48 Amazon Lambda Tools for .NET Core applications (5.10.2) Project Home: https://github.com/aws/aws-extensions-for-dotnet-cli, https://github.com/aws/aws-lambda-dotnet No .NET project found in directory /asset-input to build. Unhandled exception. System.Exception: Failed to bundle asset ...
核心问题:移除LambdaProjectLibrary引用后,cdk synth可正常执行;添加引用后,构建成功但打包阶段提示找不到项目。
问题原因
dotnet lambda package命令默认会在当前工作目录下查找可打包的.NET项目。当解决方案目录下同时存在类库项目和Lambda函数项目时,工具无法自动识别哪个是目标函数项目,因此抛出"找不到项目"的错误。
移除类库引用后,目录下只有Lambda函数项目,工具可以自动识别并打包,因此能正常执行。
解决方案
修改Bundling命令中的dotnet lambda package部分,明确指定Lambda函数项目的路径,让工具精准定位到要打包的项目。修改后的代码如下:
var buildOption = new BundlingOptions() { Image = Runtime.DOTNET_8.BundlingImage, User = "root", OutputType = BundlingOutput.ARCHIVED, Command = new string[]{ "/bin/sh", "-c", " dotnet tool install -g Amazon.Lambda.Tools"+ " && dotnet build"+ " && dotnet lambda package --project-location /asset-input/LambdaProjectFunction --output-package /asset-output/function.zip" } };
关键改动是在dotnet lambda package后添加--project-location /asset-input/LambdaProjectFunction参数,指定函数项目的目录,确保工具不会混淆类库和函数项目。
内容的提问来源于stack exchange,提问作者user20358
相关产品推荐
相关产品推荐

