9

किसी csproj फ़ाइल में इस दो का उद्देश्य है (VS2017) व्याख्या कर सकते हैं:नेट कोर RuntimeIdentifier बनाम TargetFramework

<TargetFramework>netstandard1.6</TargetFramework> 
<RuntimeIdentifier>win7</RuntimeIdentifier> 

मैं सिर्फ VS2015 से पलायन और अब मेरी वेब एपीआई प्रकाशित नहीं कर सकते क्योंकि ऐसा लगता है मैं चाहिए केवल एक लक्ष्य ढांचे का उपयोग करें। इसके अलावा मैं कई आरआईडी निर्दिष्ट नहीं कर सकता। ये सभी बदली हुई चीजें मुझे निराश करती हैं। खरोंच से कुछ भी काम नहीं करता है, कुछ खत्म हो जाना चाहिए।

मैं सिर्फ विंडोज़ पर अपना वेब-एपीआई विकसित करना चाहता हूं, यहां xUnit परीक्षण चलाएं और फिर लिनक्स (उबंटू) सर्वर पर चलाने के लिए वेब-एपीआई को तैनात करें। मुझे csproj में दोनों पैरामीटर में क्या रखना चाहिए? अच्छी व्याख्या के साथ लिंक अत्यधिक सराहना की है।

Update1

मैं संदर्भित .net मुख्य लाइब्रेरीज के साथ वेब एपीआई की है। सब कुछ जहां वीएस2015 से माइग्रेट किया गया। अब रूट प्रोजेक्ट में मेरे पास <TargetFrameworks>netcoreapp1.1;net461</TargetFrameworks> है। जब मैं VS2017 के माध्यम से प्रकाशित मैं त्रुटि मिली:

C:\Program Files\dotnet\sdk\1.0.3\Sdks\Microsoft.NET.Sdk\buildCrossTargeting\Microsoft.NET.Sdk.targets(31,5): error : The 'Publish' target is not supported without specifying a target framework. The current project targets multiple frameworks, please specify the framework for the published application.

लेकिन मैं लक्ष्य ढांचे में netcoreapp1.1 के रूप में प्रकाशित निर्दिष्ट किया है। ठीक है। फिर मैंने नीचे दिए गए अनुसार <PropertyGroup Condition="$(TargetFramework)'=='netcoreapp1.1'"> <RuntimeIdentifier>ubuntu.16.10-x64</RuntimeIdentifier> </PropertyGroup> के साथ अपना csproj अपडेट किया। लेकिन अब मैं भी ऐप्लिकेशन का निर्माण नहीं कर सकते, त्रुटि मिलती है:

5>C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\Sdks\Microsoft.NET.Sdk\build\Microsoft.NET.Sdk.targets(92,5): error : Assets file '\obj\project.assets.json' doesn't have a target for '.NETCoreApp,Version=v1.1/ubuntu.16.10-x64'. Ensure you have restored this project for TargetFramework='netcoreapp1.1' and RuntimeIdentifier='ubuntu.16.10-x64'.

मैं सिर्फ खिड़कियों 8.1/windows7 पर VS2017 के साथ विकसित करना चाहते हैं और 16.10 Ubuntu को तैनात। मैं क्या गलत कर रहा हूँ?

Update2

मैं समाधान में 8 परियोजनाएं हैं। उनमें से 3 xUnit परीक्षण हैं। इस प्रकार हमारे पास 5 परियोजनाएं हैं। इनमें से 4 कक्षा पुस्तकालय हैं और 1 मेरा वेब-ऐप है। सभी 4 वर्ग पुस्तकालयों इस है:

<TargetFrameworks>netstandard1.6;net461</TargetFrameworks>  
<ItemGroup Condition=" '$(TargetFramework)' == 'net461' "> 
    <Reference Include="System" /> 
    <Reference Include="Microsoft.CSharp" /> 
</ItemGroup> 

मेरे वेब अनुप्रयोग:

<TargetFrameworks>netcoreapp1.1;net461</TargetFrameworks> 
<ItemGroup Condition=" '$(TargetFramework)' == 'net461' "> 
    <Reference Include="System" /> 
    <Reference Include="Microsoft.CSharp" /> 
    </ItemGroup> 

मेरा वेब-ऐप को प्रकाशित करने? win7 से win7-x64 या win7-x86 के लिए उचित छुटकारा docs

पहले परिवर्तन में

उत्तर

0

RID is short for Runtime IDentifier. RIDs are used to identify target operating systems where an application or asset (that is, assembly) will run. They look like this: "ubuntu.14.04-x64", "win7-x64", "osx.10.11-x64". For the packages with native dependencies, it will designate on which platforms the package can be restored.

अधिक। इसके बाद उबंटू जैसे अन्य आरआईडी जोड़ें। उदाहरण के लिए:

<PropertyGroup> 
    <TargetFramework>netstandard1.6</TargetFramework> 
    <RuntimeIdentifier>win7-x64;ubuntu.16.10-x64</RuntimeIdentifier> 
</PropertyGroup> 

लक्ष्य ढांचा अच्छा दिख रहा है। अधिक docs

4

पढ़ लिए <TargetFramework> (या <TargetFrameworks> आप कई लक्ष्यों, करना चाहते हैं जब net451 जैसे, एक या एक से अधिक netstandard1.x आदि)। प्रति <TargetFramework>/<TargetFrameworks> प्रविष्टि का एक सेट प्रविष्टि bin\Debug\<targetframeworkid> के अंदर बनाया जाएगा और स्थित होगा)।

यह उपयोगी है, जब आप एक अलग पुस्तकालय का उपयोग करना चाहते हैं।नेट कोर (क्योंकि आपके द्वारा उपयोग की जाने वाली लाइब्रेरी केवल पूर्ण .NET Framework जैसे 4.5.1 के साथ काम करती है) या इस सुविधा को i.e. .NET कोर से हटा दें क्योंकि यह असमर्थित है।

इसका उपयोग भवन, NuGet पुनर्स्थापन दोनों के लिए किया जाता है। यानी आप एक .NET कोर परियोजना में एक net451 केवल लाइब्रेरी का उपयोग नहीं कर सकते हैं (उदाहरण के लिए netstandard 1.1 - लेकिन आप एक net451 परियोजना में netstandard1.1 उपयोग कर सकते हैं) दूसरी तरफ

<RuntimeIdentifier>/<RuntimeIdentifiers> मुख्य रूप से NuGet के लिए प्रयोग किया जाता है। यह NuGet बताता है कि आपको कौन से पैकेज चाहिए। उदाहरण के लिए यदि आप लिनक्स, मैक और विंडोज को लक्षित करना चाहते हैं, तो कुछ असेंबली को मूल पुस्तकालयों (जैसे एन्क्रिप्शन की आवश्यकता होती है। विंडोज क्रिप्टोएपीआई पर इस्तेमाल किया जाएगा, लेकिन लिनक्स और मैक पर आपको ओपनएसएसएल की आवश्यकता है)। इसमें गैर-प्रबंधित डीएलएस और * .so (लिनक्स) फ़ाइलें शामिल हैं।

यानी <RuntimeIdentifiers>win7-x64;win-7x86;ubuntu.16.10-x64</RuntimeIdentifiers> Win7 (x64 और x86) संस्करणों और x64 केवल ubuntu के लिए nuget पुनर्स्थापित पैकेज बना देगा। यह आवश्यक है, क्योंकि जब आप विंडोज़ पर काम करते हैं तो आपको इन देशी पुस्तकालयों को भी डाउनलोड करने की आवश्यकता होती है ताकि आप dotnet publish के साथ उन्हें तैनात/पैकेज कर सकें।

यहाँ एक छोटी-सी कमी है, हालांकि है: आप <TargetFramework> या <TargetFrameworks> में एक पूर्ण .नेट फ्रेमवर्क संदर्भ है, तो आप एक ही <RuntimeIdentifier> (एकवचन, बहुवचन नहीं <RuntimeIdentifiers>) निर्दिष्ट करना होगा, अन्यथा आप एक त्रुटि मिल जाएगा।

उदाहरण के लिए:

<PropertyGroup> 
    <TargetFrameworks>netstandard1.0;net451</TargetFrameworks> 
    <RuntimeIdentifiers>win7-x64;win-7x86;ubuntu.16.10-x64</RuntimeIdentifiers>  
</PropertyGroup> 

<!-- This entry will only be used for the .NET Framework 4.5.1 output --> 
<PropertyGroup Condition="'$(TargetFramework)' == 'net451'"> 
    <RuntimeIdentifier>win7-x64</RuntimeIdentifier> 
</PropertyGroup> 
+0

' netstandard1.0; net451 जब वह नेट स्टैंडर्ड का उपयोग कर' अनावश्यक है। आप कई पुरानी प्रथाओं का उपयोग कर रहे हैं –

+0

मैंने कोशिश की और यह मेरे लिए काम नहीं करता है। प्रश्न पर मेरे अपडेट देखें। – Alezis

+0

@Alezis: संदेश पढ़ें;) जब आपके पास 1 से अधिक लक्ष्य हैं, तो आपको प्रकाशित करने के लिए कौन सा संस्करण 'डॉटनेट प्रकाशित' कहना होगा। https://docs.microsoft.com/en-us/dotnet/articles/core/tools/dotnet-publish, i.e. 'dotnet publ --runtime ubuntu.16.10-x64'। इसके अलावा 'netstandard1.0; net451'' net451' अप्रचलित है (चूंकि नेट नेटवर्क्स 1.0' .NET 4.5 और उच्चतर पर चलता है। लेकिन यदि आप केवल 1.3 (.NET 4.6) में उपलब्ध सुविधाओं का उपयोग करते हैं, तो 'netstandard1.3 ; net451' का उपयोग दो बिल्ड बनाने के लिए किया जा सकता है। https://docs.microsoft.com/en-us/dotnet/articles/standard/library – Tseng

संबंधित मुद्दे