alkee-allm / k2proto

grpc service sample
6 stars 2 forks source link

appsettings.json 파일을 찾지 못하는 문제 #55

Closed alkee-allm closed 4 years ago

alkee-allm commented 4 years ago

단일 파일 배포를 사용해 k2svc.exe 를 실행(publish directory)했을 때,

 ./K2svc.exe
Unhandled exception. System.IO.FileNotFoundException: The configuration file 'appsettings.json' was not found and is not optional. The physical path is 'C:\Users\non-setting\AppData\Local\Temp\.net\K2svc\we50w3bn.4hb\appsettings.json'.
   at Microsoft.Extensions.Configuration.FileConfigurationProvider.HandleException(ExceptionDispatchInfo info)
   at Microsoft.Extensions.Configuration.FileConfigurationProvider.Load(Boolean reload)
   at Microsoft.Extensions.Configuration.FileConfigurationProvider.Load()
   at Microsoft.Extensions.Configuration.ConfigurationRoot..ctor(IList`1 providers)
   at Microsoft.Extensions.Configuration.ConfigurationBuilder.Build()
   at K2svc.Program.LoadConfig(String[] args)
   at K2svc.Program.Main(String[] args)

와 같은 exception(crash) 발생

참고

alkee-allm commented 4 years ago

reference 에서는

private static string GetBasePath()
{
    var isDevelopment = ASPNETCORE_ENVIRONMENT == Environments.Development;
    if (isDevelopment) return System.IO.Directory.GetCurrentDirectory(); // 개발환경

    // stage or production
    using var processModule = System.Diagnostics.Process.GetCurrentProcess().MainModule;
    return System.IO.Path.GetDirectoryName(processModule?.FileName);
}

와 같은 경로를 사용하도록 하는데, 개발환경(visual studio 사용)의 경우에 GetCurrentDirectory 를 사용하는 이유가 명확하지 않다. appsettings.json 파일은 output directory 에 복사되도록 설정되어있기 때문에 필요 없어 보이는데...

alkee-allm commented 4 years ago

그렇다고, 항상 process path 를 사용하는 방법은 합리적일까?

        private static string CurrentProcessPath
            => System.IO.Path.GetDirectoryName(System.Diagnostics.Process.GetCurrentProcess().MainModule?.FileName);

multi instance 테스트를 위해서 서로다른 publish 된 중복 파일을 넣는 것 보다, 하나의 공유된 경로에 binary 를 두고, working directory 에서 이곳에 log 나 appsettings 처리를 하는것이 가능하다면 좋을텐데..

appsettingsCurrentProcessPathWorkingDirectory 두군데에서 찾고 양쪽에 있는 경우 exception(비직관적인 순서로 인한 실수 방지), 한쪽에만 있는경우 이를 이용하도록 하는 방법이라면? appsettings.json출력 디렉터리로 복사 속성 때문에, Visual studio 에서 working(project) directory 와 output directory 에 모두 존재하게되어 문제가 예상된다. 그렇다고 출력 디렉터리로 복사를 하지 않게되면 배포시에 이 파일이 빠지게 되니 이 또한 문제가 있을 것인데...

따라서, Main 에서 로깅을 이용해 중복된 파일이 감지되는 경우 Warning 하고, working directory 의 appsettings.json을 사용하도록(개발 환경 우선) 하는 방식을 사용하는 아이디어.

Main 에서, HostBuilder 를 생성하기 전에 logging 이 필요한 경우 LoggerFactory 를 이용해 직접 개체를 생성하고 provider 를 설정한 후 logging 해야한다.