मैं appsettings.json फ़ाइल को खोजने के लिए अपने .NET कोर 3 एकल फ़ाइल ऐप को कैसे प्राप्त कर सकता हूं?


11

appsettings.jsonएकल-फ़ाइल अनुप्रयोग के लिए बनाया गया है जो एक ही निर्देशिका में है जो फ़ाइल के लिए देखने के लिए एकल-फ़ाइल .net Core 3.0 वेब API एप्लिकेशन को कैसे कॉन्फ़िगर किया जाना चाहिए ?

चलने के बाद

dotnet publish -r win-x64 -c Release /p:PublishSingleFile=true

निर्देशिका इस तरह दिखती है:

XX/XX/XXXX  XX:XX PM    <DIR>          .
XX/XX/XXXX  XX:XX PM    <DIR>          ..
XX/XX/XXXX  XX:XX PM               134 appsettings.json
XX/XX/XXXX  XX:XX PM        92,899,983 APPNAME.exe
XX/XX/XXXX  XX:XX PM               541 web.config
               3 File(s)     92,900,658 bytes

हालाँकि, APPNAME.exeनिम्न त्रुटि में परिणाम चलाने का प्रयास कर रहा है

An exception occurred, System.IO.FileNotFoundException: The configuration file 'appsettings.json' was not found and is not optional. The physical path is 'C:\Users\USERNAME\AppData\Local\Temp\.net\APPNAME\kyl3yc02.5zs\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 Microsoft.AspNetCore.Hosting.WebHostBuilder.BuildCommonServices(AggregateException& hostingStartupErrors)
   at Microsoft.AspNetCore.Hosting.WebHostBuilder.Build()
...

मैंने एक समान, लेकिन विशिष्ट प्रश्न और साथ ही अन्य स्टैक ओवरफ्लो प्रश्नों से समाधान की कोशिश की ।

मैंने निम्नलिखित को पारित करने का प्रयास किया SetBasePath()

  • Directory.GetCurrentDirectory()

  • environment.ContentRootPath

  • Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)

प्रत्येक ने एक ही त्रुटि का नेतृत्व किया।

समस्या की जड़ यह है कि PublishSingleFileबाइनरी अनज़िप्ड है और एक tempडायरेक्टरी से चलती है ।

इस एकल फ़ाइल ऐप के मामले में, यह जिस स्थान को देख रहा appsettings.jsonथा वह निम्न निर्देशिका थी:

C:\Users\USERNAME\AppData\Local\Temp\.net\APPNAME\kyl3yc02.5zs

उपरोक्त सभी विधियाँ उस स्थान की ओर इंगित करती हैं जिस पर फ़ाइल को अनज़िप किया गया है, जो उस स्थान से भिन्न है जहाँ से इसे चलाया गया था।

जवाबों:


13

मुझे यहाँ GitHub पर एक मुद्दा मिला शीर्षक मिला PublishSingleFile excluding appsettings not working as expected

यह एक और मुद्दे की ओर इशारा करता है शीर्षक सेsingle file publish: AppContext.BaseDirectory doesn't point to apphost directory

इसमें, एक समाधान का प्रयास करना था Process.GetCurrentProcess().MainModule.FileName

निम्नलिखित कोड ने एप्लिकेशन को उस निर्देशिका को देखने के लिए कॉन्फ़िगर किया है, जो एकल-निष्पादन योग्य एप्लिकेशन से चलाया गया था, न कि उस स्थान से जिसे बायनेरिज़ को निकाला गया था।

config.SetBasePath(GetBasePath());
config.AddJsonFile("appsettings.json", false);

GetBasePath()कार्यान्वयन:

private string GetBasePath()
{
    using var processModule = Process.GetCurrentProcess().MainModule;
    return Path.GetDirectoryName(processModule?.FileName);
}

यह उत्तर, प्लस @ रॉनल्ड-स्वेन नीचे सही है। ऐपसेटिंग को बंडल किए गए exe से बाहर रखा गया है, और प्रकाशन कार्य बंडल exe के साथ-साथ ऐपसेटिंग फ़ाइलों को रखता है।
आरोन हुडोन 22

8

यदि आप निष्पादन योग्य के बाहर रनटाइम में उपयोग की जाने वाली फ़ाइलों के साथ ठीक हैं, तो आप बस उन फ़ाइलों को फ़्लैग कर सकते हैं, जिन्हें आप बाहर चाहते हैं, csproj में। यह विधि लाइव परिवर्तनों और ऐसे ज्ञात स्थान के लिए अनुमति देती है।

<ItemGroup>
    <None Include="appsettings.json">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
      <CopyToPublishDirectory>Always</CopyToPublishDirectory>
      <ExcludeFromSingleFile>true</ExcludeFromSingleFile>
    </None>
    <None Include="appsettings.Development.json;appsettings.QA.json;appsettings.Production.json;">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
      <CopyToPublishDirectory>Always</CopyToPublishDirectory>
      <DependentUpon>appsettings.json</DependentUpon>
      <ExcludeFromSingleFile>true</ExcludeFromSingleFile>
    </None>
  </ItemGroup>

  <ItemGroup>
    <None Include="Views\Test.cshtml">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
      <ExcludeFromSingleFile>true</ExcludeFromSingleFile>
    </None>
  </ItemGroup>

यदि यह स्वीकार्य नहीं है, और इसमें केवल एक ही फ़ाइल होनी चाहिए, तो मैं अपने होस्ट सेटअप में रूट पथ के रूप में एकल-फ़ाइल-निकाले गए पथ को पास करता हूं। यह कॉन्फ़िगरेशन, और रेजर (जो मैं बाद में जोड़ता हूं) को इसकी फ़ाइलों को सामान्य रूप से खोजने की अनुमति देता है।

// when using single file exe, the hosts config loader defaults to GetCurrentDirectory
            // which is where the exe is, not where the bundle (with appsettings) has been extracted.
            // when running in debug (from output folder) there is effectively no difference
            var realPath = Directory.GetParent(System.Reflection.Assembly.GetExecutingAssembly().Location).FullName;

            var host = Host.CreateDefaultBuilder(args).UseContentRoot(realPath);

ध्यान दें, सही मायने में एक फ़ाइल, और कोई पीडीबी बनाने के लिए, आपको इसकी भी आवश्यकता होगी:

<DebugType>None</DebugType>

लक्ष्य कंप्यूटर पर आपके उदाहरण में Views \ Test.cshtml कैसे मिलता है? मेरे पास छवि और शब्दकोश फाइलें हैं, जिन्हें मुझे संस्कृति के आधार पर खोलने की आवश्यकता है,
पॉल कोहेन

@PaCCohen मैं आमतौर पर SCP का उपयोग करके प्रकाशित आउटपुट स्थान से सभी फ़ाइलों को तैनात करेगा। केवल csproj में परिवर्तन (पहला उदाहरण) डिफ़ॉल्ट रूट सामग्री निर्देशिका का उपयोग कर रहे हैं जो किसी भी एपीआई के लिए काम कर रहे निर्देशिका में अपनी फ़ाइलें उपलब्ध होने की आवश्यकता होगी। ऐसा लगता है कि आपको निकाले गए सामग्री के वास्तविक पथ को प्राप्त करने के लिए 2 उदाहरण का उपयोग करने की आवश्यकता है, ताकि आप जिस तरह से छवियों को एक पूर्ण पथ से एक्सेस कर सकें, या सामग्री रूट को सही तरीके से सेट कर सकें ताकि ~ / ... पथ छवियों को रेजर में इस्तेमाल किया जा सकता है।
रोनाल्ड स्वेन

मेरी पृष्ठभूमि एम्बेडेड अनुप्रयोगों में है इसलिए एक एकल बाइनरी को आमतौर पर रोम में जला दिया जाता है। मुझे जो अहसास हो रहा है, वह है एक्सई जिसे मैं किसी तरह की सेल्फी "जिप जैसी" फाइल में शेयर करता हूं। मेरे सभी डेटा फ़ाइलें वहां हैं और जब एप्लिकेशन चलाया जाता है तो सब कुछ सीधे एक अस्थायी पर निकाला जाता है। अगर मुझे लगता है कि मैं अपनी डेटा फाइलें पा सकता हूं। इसका मतलब यह भी है कि मुझे कुछ तर्क चाहिए ताकि मैं वीएस में डिबग कर सकूं जहां डेटा कहीं और है।
पॉल कोहेन

1
वर्तमान में मेरे पास यह सेटअप है, और इसने फ़ाइलों को खोजना बंद कर दिया है।
गोइंग-
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.