আমি কীভাবে আমার। নেট কোর 3 একক ফাইল অ্যাপ্লিকেশনটিকে অ্যাপসেটেটিংস.জসন ফাইলটি পেতে পারি?


11

appsettings.jsonসিঙ্গল-ফাইল অ্যাপ্লিকেশনটি যে ডিরেক্টরিতে নির্মিত সে একই ডিরেক্টরিতে থাকা ফাইলটির জন্য কীভাবে একটি একক-ফাইল। নেট কোর 3.0 ওয়েব এপিআই অ্যাপ্লিকেশনটি কনফিগার করা উচিত?

দৌড়ানোর পরে

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

আমি এখানে শিরোনামে গিটহাবে একটি সমস্যা পেয়েছি 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);
}

এই উত্তরটি, আরও নীচে @ রোনাল্ড-সোয়েন নিখুঁত। অ্যাপ্ল্যাটিংগুলি বান্ডিলযুক্ত এক্সে থেকে বাদ দেওয়া হয়েছে এবং প্রকাশের টাস্কটি বান্ডিলযুক্ত এক্সের পাশাপাশি অ্যাপসেটিং ফাইলগুলি রাখে।
অ্যারন হুডন

8

যদি আপনি এক্সিকিউটেবলের বাইরের রানটাইমের সময় ফাইলগুলি ব্যবহার করে ঠিক থাকেন তবে সিএসপিজেজে আপনি যে ফাইলগুলি বাইরে চান তা কেবল পতাকাঙ্কিত করতে পারেন। এই পদ্ধতিটি লাইভ পরিবর্তনগুলির জন্য এবং যেমন একটি পরিচিত স্থানে অনুমতি দেয়।

<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>

আপনার উদাহরণের দর্শনগুলি \ Test.cshtml কীভাবে টার্গেট কম্পিউটারে পাবেন? সংস্কৃতির উপর ভিত্তি করে আমার খুলতে হবে এমন চিত্র এবং অভিধান ফাইল রয়েছে
পল কোহেন

@ পলকোহেন আমি সাধারণত এসসিপি ব্যবহার করে প্রকাশিত আউটপুট অবস্থান থেকে সমস্ত ফাইল মোতায়েন করব। কেবলমাত্র সিএসপিজেজে পরিবর্তনের (প্রথম উদাহরণ) ডিফল্ট মূল বিষয়বস্তু ডিরেক্টরি ব্যবহার করা কোনও API গুলি তাদের ফাইলগুলি কার্যকরী ডিরেক্টরিতে উপলব্ধ থাকতে হবে। দেখে মনে হচ্ছে আপনার নিষ্ক্রিয় সামগ্রীর আসল পথ পেতে ২ য় উদাহরণ ব্যবহার করা দরকার, যাতে আপনি পুরো পথ থেকে চিত্রগুলি অ্যাক্সেস করতে পারেন বা সামগ্রী সঠিকভাবে সেট করে যাতে correctly / ... পথগুলি ছবিতে রেজার ব্যবহার করা যেতে পারে।
রোনাল্ড সোয়েন

আমার ব্যাকগ্রাউন্ড এম্বেড থাকা অ্যাপ্লিকেশনগুলিতে তাই একক বাইনারি সাধারণত রোমে পুড়ে যায়। আমি যেটা বুঝতে পারছি তা হল আমি একরকম স্ব এক্সট্র্যাক্টিং "জিপ লাইক" ফাইলটিতে ভাগ করে নিই। আমার সমস্ত ডেটা ফাইল সেখানে রয়েছে এবং যখন অ্যাপ্লিকেশনটি চালানো হয় তখন সমস্ত কিছু সরাসরি একটি টেম্পে সরানো হয়। যদি আমি খুঁজে পাই যে আমি আমার ডেটা ফাইলগুলি খুঁজে পেতে পারি। এর অর্থ হ'ল আমার কিছু যুক্তি প্রয়োজন যাতে ডেটা অন্য কোথাও রয়েছে সেদিকে ভিএস ডিবেগ করতে পারি।
পল কোহেন

1
আমার বর্তমানে এই সেটআপটি রয়েছে এবং এটি এলোমেলোভাবে ফাইলগুলি সন্ধান বন্ধ করে দিয়েছে।
যাচ্ছেন ২
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.