Skip to content

Commit

Permalink
Add --nbloaderverpolicy and BeautyNBLoaderVerPolicy option
Browse files Browse the repository at this point in the history
related issues: #65
  • Loading branch information
liesauer committed Oct 23, 2024
1 parent d2058f5 commit d4e4121
Show file tree
Hide file tree
Showing 92 changed files with 75,106 additions and 22 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ __MACOSX
# Build results
[Bb]in/
[Oo]bj/
[Dd]ebug/
[Rr]elease/
[Pp]ublish/
tools/
Expand Down
2 changes: 1 addition & 1 deletion Common/Common.props
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<PackageOutputPath>.nupkg</PackageOutputPath>
<Version>2.1.4.5</Version>
<Version>2.1.4.6</Version>

<Company>nulastudio</Company>
<Authors>LiesAuer</Authors>
Expand Down
19 changes: 17 additions & 2 deletions NetBeauty.sln
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.31019.35
# Visual Studio Version 17
VisualStudioVersion = 17.9.34728.123
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WPFTest", "NetBeautyTest\WPFTest\WPFTest.csproj", "{932C8DC7-1EB0-439B-B7AA-BE719712DA82}"
EndProject
Expand Down Expand Up @@ -35,6 +35,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WsClient", "NetBeautyTest\S
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetFxTest", "NetBeautyTest\NetFxTest\NetFxTest.csproj", "{B00BF1D5-D055-456E-869D-1FD75EF20A29}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RazorTest", "NetBeautyTest\RazorTest\RazorTest.csproj", "{FC735912-F38D-45A6-91AB-981BACE21FCC}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand Down Expand Up @@ -183,6 +185,18 @@ Global
{B00BF1D5-D055-456E-869D-1FD75EF20A29}.Release|x64.Build.0 = Release|Any CPU
{B00BF1D5-D055-456E-869D-1FD75EF20A29}.Release|x86.ActiveCfg = Release|Any CPU
{B00BF1D5-D055-456E-869D-1FD75EF20A29}.Release|x86.Build.0 = Release|Any CPU
{FC735912-F38D-45A6-91AB-981BACE21FCC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FC735912-F38D-45A6-91AB-981BACE21FCC}.Debug|Any CPU.Build.0 = Debug|Any CPU
{FC735912-F38D-45A6-91AB-981BACE21FCC}.Debug|x64.ActiveCfg = Debug|Any CPU
{FC735912-F38D-45A6-91AB-981BACE21FCC}.Debug|x64.Build.0 = Debug|Any CPU
{FC735912-F38D-45A6-91AB-981BACE21FCC}.Debug|x86.ActiveCfg = Debug|Any CPU
{FC735912-F38D-45A6-91AB-981BACE21FCC}.Debug|x86.Build.0 = Debug|Any CPU
{FC735912-F38D-45A6-91AB-981BACE21FCC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FC735912-F38D-45A6-91AB-981BACE21FCC}.Release|Any CPU.Build.0 = Release|Any CPU
{FC735912-F38D-45A6-91AB-981BACE21FCC}.Release|x64.ActiveCfg = Release|Any CPU
{FC735912-F38D-45A6-91AB-981BACE21FCC}.Release|x64.Build.0 = Release|Any CPU
{FC735912-F38D-45A6-91AB-981BACE21FCC}.Release|x86.ActiveCfg = Release|Any CPU
{FC735912-F38D-45A6-91AB-981BACE21FCC}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand All @@ -201,6 +215,7 @@ Global
{9B772369-9C0E-4ED6-ABE7-815D12923A83} = {3283AE43-F95A-4DF0-940B-D35F1B49DC8B}
{3DDE26EE-956B-4CBC-A427-C5033F667527} = {3283AE43-F95A-4DF0-940B-D35F1B49DC8B}
{B00BF1D5-D055-456E-869D-1FD75EF20A29} = {892E4718-267A-4854-8127-C77903D24F17}
{FC735912-F38D-45A6-91AB-981BACE21FCC} = {892E4718-267A-4854-8127-C77903D24F17}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {E6C30250-7EA2-4421-A76A-39E93BF71486}
Expand Down
24 changes: 22 additions & 2 deletions NetBeauty/src/main/beauty.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,9 @@ var excludes = ""
var hiddens = ""
var sharedRuntimeMode = false
var noRuntimeInfo = false

// auto with without
var nbloaderVerPolicy = "auto"
var enableDebug = false
var usePatch = false
var isNetFx = false
Expand Down Expand Up @@ -157,7 +160,19 @@ func main() {
log.LogDetail("Use Patch: No")
}

success := manager.AddStartUpHookToDeps(deps.deps, startupHook, startupHookVersion)
_startupHookVersion := ""

if nbloaderVerPolicy == "" || nbloaderVerPolicy == "auto" {
if manager.CheckNeedStartHookVersion(deps.deps) {
_startupHookVersion = startupHookVersion
}
} else if nbloaderVerPolicy == "with" {
_startupHookVersion = startupHookVersion
} else if nbloaderVerPolicy == "" {
_startupHookVersion = ""
}

success := manager.AddStartUpHookToDeps(deps.deps, startupHook, _startupHookVersion)

usePatch = SCDMode && usePatch

Expand Down Expand Up @@ -409,6 +424,8 @@ Info: Log everything.
flag.BoolVar(&usePatch, "usepatch", false, `[.NET Core App Only] use the patched hostfxr to reduce files`)
flag.StringVar(&hiddens, "hiddens", "", `dlls that end users never needed, so hide them.`)
flag.StringVar(&rollForward, "roll-forward", "", `override default roll-forward behavior, see https://learn.microsoft.com/en-us/dotnet/core/versions/selection#control-roll-forward-behavior for more details.`)
flag.StringVar(&nbloaderVerPolicy, "nbloaderverpolicy", "auto", `nbloader versioning policy, see https://github.com/nulastudio/NetBeauty2/issues/65 for more details.
`)
flag.StringVar(&appHostEntry, "apphostentry", "", `[.NET Core Non Single-File App Only] patch apphost entry location.`)
flag.StringVar(&appHostDir, "apphostdir", "", `[.NET Core Non Single-File App Only] relative path based on beautyDir.`)

Expand Down Expand Up @@ -501,6 +518,9 @@ Info: Log everything.
}
beautyDir = absDir

nbloaderVerPolicy = strings.TrimSpace(nbloaderVerPolicy)
nbloaderVerPolicy = strings.ToLower(nbloaderVerPolicy)

appHostEntry = strings.Trim(appHostEntry, `"`)
strings.ReplaceAll(appHostEntry, "\\", "/")

Expand Down Expand Up @@ -528,7 +548,7 @@ func exit() {

func usage() {
fmt.Println("Usage:")
fmt.Println("nbeauty [--loglevel=(Error|Detail|Info)] [--srmode] [--enabledebug] [--usepatch] [--hiddens=hiddenFiles] [--noruntimeinfo] [--roll-forward=<rollForward>] [--apphostentry=<appHostEntry>] [--apphostdir=<appHostDir>] <beautyDir> [<libsDir> [<excludes>]]")
fmt.Println("nbeauty [--loglevel=(Error|Detail|Info)] [--srmode] [--enabledebug] [--usepatch] [--hiddens=hiddenFiles] [--noruntimeinfo] [--roll-forward=<rollForward>] [--nbloaderverpolicy=(auto|with|without)] [--apphostentry=<appHostEntry>] [--apphostdir=<appHostDir>] <beautyDir> [<libsDir> [<excludes>]]")
fmt.Println("")
fmt.Println("Arguments")
fmt.Println(" <excludes> dlls that no need to be moved, multi-dlls separated with \";\". Example: dll1.dll;lib*;...")
Expand Down
4 changes: 2 additions & 2 deletions NetBeauty/src/main/bindata.go

Large diffs are not rendered by default.

100 changes: 98 additions & 2 deletions NetBeauty/src/manager/manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -280,17 +280,27 @@ func AddStartUpHookToDeps(deps string, hook string, version string) bool {

runtimeTarget, _ := json.GetPath("runtimeTarget", "name").String()

hookEntry := hook

if version != "" {
hookEntry = hook + "/" + version

log.LogDetail("Need NBLoader Version: Yes")
} else {
log.LogDetail("Need NBLoader Version: No")
}

json.SetPath([]string{
"targets",
runtimeTarget,
hook + "/" + version,
hookEntry,
"runtime",
hook + ".dll",
}, make(map[string]interface{}))

json.SetPath([]string{
"libraries",
hook + "/" + version,
hookEntry,
}, map[string]interface{}{
"type": "project",
"serviceable": false,
Expand Down Expand Up @@ -708,6 +718,92 @@ func FindFXRVersion(deps string) (string, string) {
return "", ""
}

// CheckNeedStartHookVersion 分析deps.json中是否需要添加starthook版本号的依赖项
func CheckNeedStartHookVersion(deps string) bool {
var allAnalyzedDeps = make([]analyzedDeps, 0)

jsonBytes, err := ioutil.ReadFile(deps)
if err != nil {
return false
}

json, err := simplejson.NewJson(jsonBytes)
if err != nil {
return false
}

targets, _ := json.Get("targets").Map()
for _, target := range targets {
for _, depsObj := range target.(map[string]interface{}) {
runtime := depsObj.(map[string]interface{})["runtime"]
if runtime != nil {
for filePath := range runtime.(map[string]interface{}) {
filePath2 := strings.ReplaceAll(filePath, "\\", "/")
parts := strings.Split(filePath2, "/")
fileName := parts[len(parts)-1]

allAnalyzedDeps = append(allAnalyzedDeps, analyzedDeps{
Category: runtime.(map[string]interface{}),
ItemKey: filePath,
Name: fileName,
Path: fileName,
SecondPath: fileName,
Type: Assembly,
Locale: "",
})
}
}

resources := depsObj.(map[string]interface{})["resources"]
if resources != nil {
for filePath, locale := range resources.(map[string]interface{}) {
filePath2 := strings.ReplaceAll(filePath, "\\", "/")
parts := strings.Split(filePath2, "/")
fileName := parts[len(parts)-1]
culture := locale.(map[string]interface{})["locale"].(string)

allAnalyzedDeps = append(allAnalyzedDeps, analyzedDeps{
Category: resources.(map[string]interface{}),
ItemKey: filePath,
Name: fileName,
Path: culture + "/" + fileName,
SecondPath: culture + "/" + fileName,
Type: Resource,
Locale: culture,
})
}
}

native := depsObj.(map[string]interface{})["native"]
if native != nil {
for filePath := range native.(map[string]interface{}) {
filePath2 := strings.ReplaceAll(filePath, "\\", "/")
parts := strings.Split(filePath2, "/")
fileName := parts[len(parts)-1]

allAnalyzedDeps = append(allAnalyzedDeps, analyzedDeps{
Category: native.(map[string]interface{}),
ItemKey: filePath,
Name: fileName,
Path: fileName,
SecondPath: filePath2,
Type: Native,
Locale: "",
})
}
}
}
}

for _, analyzed := range allAnalyzedDeps {
if strings.Contains(analyzed.Name, "Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation") {
return true
}
}

return false
}

// FixDeps 分析deps.json中的依赖项
func FixDeps(deps string, entry string, SCDMode bool, noRuntimeInfo bool, usePatch bool, enableDebug bool, sharedRuntimeMode bool) ([]Deps, bool, bool) {
var isAspNetCore = false
Expand Down
Binary file modified NetBeauty/src/nbloader/nbloader.dll
Binary file not shown.
11 changes: 6 additions & 5 deletions NetBeautyNuget/Beauty.targets
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
<BeautyUsePatch Condition="$(BeautyUsePatch) == 'True'">--usepatch</BeautyUsePatch>
<BeautyNoRuntimeInfo Condition="$(BeautyNoRuntimeInfo) != 'True'"></BeautyNoRuntimeInfo>
<BeautyNoRuntimeInfo Condition="$(BeautyNoRuntimeInfo) == 'True'">--noruntimeinfo</BeautyNoRuntimeInfo>
<BeautyNBLoaderVerPolicy Condition="$(BeautyNBLoaderVerPolicy) != ''">--nbloaderverpolicy "$(BeautyNBLoaderVerPolicy)"</BeautyNBLoaderVerPolicy>
<BeautyAppHostEntry Condition="$(BeautyAppHostEntry) != ''">--apphostentry "$(BeautyAppHostEntry)"</BeautyAppHostEntry>
<BeautyAppHostDir Condition="$(BeautyAppHostDir) != ''">--apphostdir "$(BeautyAppHostDir)"</BeautyAppHostDir>
<_BeautyDependsOnForBuild_NetFx Condition="'$(MSBuildRuntimeType)' == 'Full'">AfterBuild;$(BeautyAfterTasks)</_BeautyDependsOnForBuild_NetFx>
Expand Down Expand Up @@ -115,7 +116,7 @@ Args = string.Join(" ", CommandLineArgs);
<BeautyDir>"%(_BeautyPublishDir.FullPath)/."</BeautyDir>
</PropertyGroup>

<Exec Command="$(BeautyBin) $(BeautyGitCDN) $(BeautyGitTree) $(BeautyLogLevel) $(BeautySharedRuntimeMode) $(BeautyEnableDebugging) $(BeautyUsePatch) $(BeautyHiddens) $(BeautyNoRuntimeInfo) $(BeautyAppHostEntry) $(BeautyAppHostDir) $(BeautyDir) $(BeautyLibsDir) $(BeautyExcludes)" />
<Exec Command="$(BeautyBin) $(BeautyGitCDN) $(BeautyGitTree) $(BeautyLogLevel) $(BeautySharedRuntimeMode) $(BeautyEnableDebugging) $(BeautyUsePatch) $(BeautyHiddens) $(BeautyNoRuntimeInfo) $(BeautyNBLoaderVerPolicy) $(BeautyAppHostEntry) $(BeautyAppHostDir) $(BeautyDir) $(BeautyLibsDir) $(BeautyExcludes)" />
</Target>

<Target Name="NetBeautyOnPublish_Fx" AfterTargets="$(_BeautyDependsOnForPublish_NetFx)" Condition="$(DisableBeauty) != 'True' And '$(_BeautyOnBuild)' != 'True'">
Expand All @@ -129,17 +130,17 @@ Args = string.Join(" ", CommandLineArgs);
<BeautyDir2>"%(_BeautyPublishDir2.FullPath)/."</BeautyDir2>
</PropertyGroup>

<Exec Command="$(BeautyBin) $(BeautyGitCDN) $(BeautyGitTree) $(BeautyLogLevel) $(BeautySharedRuntimeMode) $(BeautyEnableDebugging) $(BeautyUsePatch) $(BeautyHiddens) $(BeautyNoRuntimeInfo) $(BeautyAppHostEntry) $(BeautyAppHostDir) $(BeautyDir) $(BeautyLibsDir) $(BeautyExcludes)" />
<Exec Command="$(BeautyBin) $(BeautyGitCDN) $(BeautyGitTree) $(BeautyLogLevel) $(BeautySharedRuntimeMode) $(BeautyEnableDebugging) $(BeautyUsePatch) $(BeautyHiddens) $(BeautyNoRuntimeInfo) $(BeautyNBLoaderVerPolicy) $(BeautyAppHostEntry) $(BeautyAppHostDir) $(BeautyDir) $(BeautyLibsDir) $(BeautyExcludes)" />

<Exec Condition="'$(BeautyDir2)' != '$(BeautyDir)'" Command="$(BeautyBin) $(BeautyGitCDN) $(BeautyGitTree) $(BeautyLogLevel) $(BeautySharedRuntimeMode) $(BeautyEnableDebugging) $(BeautyUsePatch) $(BeautyHiddens) $(BeautyNoRuntimeInfo) $(BeautyAppHostEntry) $(BeautyAppHostDir) $(BeautyDir2) $(BeautyLibsDir) $(BeautyExcludes)" />
<Exec Condition="'$(BeautyDir2)' != '$(BeautyDir)'" Command="$(BeautyBin) $(BeautyGitCDN) $(BeautyGitTree) $(BeautyLogLevel) $(BeautySharedRuntimeMode) $(BeautyEnableDebugging) $(BeautyUsePatch) $(BeautyHiddens) $(BeautyNoRuntimeInfo) $(BeautyNBLoaderVerPolicy) $(BeautyAppHostEntry) $(BeautyAppHostDir) $(BeautyDir2) $(BeautyLibsDir) $(BeautyExcludes)" />
</Target>

<Target Name="NetBeautyOnBuild" AfterTargets="$(_BeautyDependsOnForBuild_Core)" Condition="$(DisableBeauty) != 'True' And '$(_BeautyOnBuild)' == 'True'">
<PropertyGroup>
<BeautyDir>"$(TargetDir)/."</BeautyDir>
</PropertyGroup>

<Exec Command="$(BeautyBin) $(BeautyGitCDN) $(BeautyGitTree) $(BeautyLogLevel) $(BeautySharedRuntimeMode) $(BeautyEnableDebugging) $(BeautyUsePatch) $(BeautyHiddens) $(BeautyNoRuntimeInfo) $(BeautyAppHostEntry) $(BeautyAppHostDir) $(BeautyDir) $(BeautyLibsDir) $(BeautyExcludes)" />
<Exec Command="$(BeautyBin) $(BeautyGitCDN) $(BeautyGitTree) $(BeautyLogLevel) $(BeautySharedRuntimeMode) $(BeautyEnableDebugging) $(BeautyUsePatch) $(BeautyHiddens) $(BeautyNoRuntimeInfo) $(BeautyNBLoaderVerPolicy) $(BeautyAppHostEntry) $(BeautyAppHostDir) $(BeautyDir) $(BeautyLibsDir) $(BeautyExcludes)" />
</Target>

<Target Name="NetBeautyOnPublish" AfterTargets="$(_BeautyDependsOnForPublish_Core)" Condition="$(DisableBeauty) != 'True' And '$(_BeautyOnBuild)' != 'True'">
Expand All @@ -151,6 +152,6 @@ Args = string.Join(" ", CommandLineArgs);
<BeautyDir>"%(_BeautyPublishDir.FullPath)/."</BeautyDir>
</PropertyGroup>

<Exec Command="$(BeautyBin) $(BeautyGitCDN) $(BeautyGitTree) $(BeautyLogLevel) $(BeautySharedRuntimeMode) $(BeautyEnableDebugging) $(BeautyUsePatch) $(BeautyHiddens) $(BeautyNoRuntimeInfo) $(BeautyAppHostEntry) $(BeautyAppHostDir) $(BeautyDir) $(BeautyLibsDir) $(BeautyExcludes)" />
<Exec Command="$(BeautyBin) $(BeautyGitCDN) $(BeautyGitTree) $(BeautyLogLevel) $(BeautySharedRuntimeMode) $(BeautyEnableDebugging) $(BeautyUsePatch) $(BeautyHiddens) $(BeautyNoRuntimeInfo) $(BeautyNBLoaderVerPolicy) $(BeautyAppHostEntry) $(BeautyAppHostDir) $(BeautyDir) $(BeautyLibsDir) $(BeautyExcludes)" />
</Target>
</Project>
4 changes: 3 additions & 1 deletion NetBeautyTest/AvaloniaTest/AvaloniaTest/AvaloniaTest.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@
<BeautyOnPublishOnly>False</BeautyOnPublishOnly>
<!-- DO NOT TOUCH THIS OPTION -->
<BeautyNoRuntimeInfo>False</BeautyNoRuntimeInfo>
<!-- valid values: auto|with|without -->
<BeautyNBLoaderVerPolicy>auto</BeautyNBLoaderVerPolicy>
<!-- set to True if you want to allow 3rd debuggers(like dnSpy) debugs the app -->
<BeautyEnableDebugging>False</BeautyEnableDebugging>
<!-- the patch can reduce the file count -->
Expand All @@ -51,7 +53,7 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="nulastudio.NetBeauty" Version="2.1.4.5" />
<PackageReference Include="nulastudio.NetBeauty" Version="2.1.4.6" />
</ItemGroup>

</Project>
4 changes: 3 additions & 1 deletion NetBeautyTest/ChromelyTest/ChromelyTest.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,8 @@
<BeautyOnPublishOnly>False</BeautyOnPublishOnly>
<!-- DO NOT TOUCH THIS OPTION -->
<BeautyNoRuntimeInfo>False</BeautyNoRuntimeInfo>
<!-- valid values: auto|with|without -->
<BeautyNBLoaderVerPolicy>auto</BeautyNBLoaderVerPolicy>
<!-- set to True if you want to allow 3rd debuggers(like dnSpy) debugs the app -->
<BeautyEnableDebugging>False</BeautyEnableDebugging>
<!-- the patch can reduce the file count -->
Expand All @@ -79,7 +81,7 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="nulastudio.NetBeauty" Version="2.1.4.5" />
<PackageReference Include="nulastudio.NetBeauty" Version="2.1.4.6" />
</ItemGroup>

</Project>
4 changes: 3 additions & 1 deletion NetBeautyTest/NetFxTest/NetFxTest.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@
<BeautyOnPublishOnly>False</BeautyOnPublishOnly>
<!-- DO NOT TOUCH THIS OPTION -->
<BeautyNoRuntimeInfo>False</BeautyNoRuntimeInfo>
<!-- valid values: auto|with|without -->
<BeautyNBLoaderVerPolicy>auto</BeautyNBLoaderVerPolicy>
<!-- set to True if you want to allow 3rd debuggers(like dnSpy) debugs the app -->
<BeautyEnableDebugging>False</BeautyEnableDebugging>
<!-- the patch can reduce the file count -->
Expand Down Expand Up @@ -156,7 +158,7 @@
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<ItemGroup>
<PackageReference Include="nulastudio.NetBeauty" Version="2.1.4.5" />
<PackageReference Include="nulastudio.NetBeauty" Version="2.1.4.6" />
<PackageReference Include="SixLabors.ImageSharp">
<Version>2.1.9</Version>
</PackageReference>
Expand Down
27 changes: 27 additions & 0 deletions NetBeautyTest/RazorTest/Pages/Error.cshtml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
@page
@model ErrorModel
@{
ViewData["Title"] = "Error";
}

<h1 class="text-danger">Error.</h1>
<h2 class="text-danger">An error occurred while processing your request.</h2>

@if (Model.ShowRequestId)
{
<p>
<strong>Request ID:</strong> <code>@Model.RequestId</code>
</p>
}

<h3>Development Mode</h3>
<p>
Swapping to the <strong>Development</strong> environment displays detailed information about the error that occurred.
</p>
<p>
<strong>The Development environment shouldn't be enabled for deployed applications.</strong>
It can result in displaying sensitive information from exceptions to end users.
For local debugging, enable the <strong>Development</strong> environment by setting the <strong>ASPNETCORE_ENVIRONMENT</strong> environment variable to <strong>Development</strong>
and restarting the app.
</p>

Loading

0 comments on commit d4e4121

Please sign in to comment.