国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

分析器/源生成器添加項(xiàng)目依賴的方式

這篇具有很好參考價(jià)值的文章主要介紹了分析器/源生成器添加項(xiàng)目依賴的方式。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

title: 分析器/源生成器添加項(xiàng)目依賴的方式
date: 2024-01-20
categories: 編程
tags:
- C#
- .NET
- Roslyn

前言

寫分析器(源生成器)時(shí)經(jīng)常需要引用別的包,但直接引用是無法運(yùn)行的。
下面我們分不同情況來討論在分析器項(xiàng)目如何對(duì)依賴進(jìn)行引用。

下圖中“包引用”指PackageReference,“項(xiàng)目引用”指ProjectReference。

其中項(xiàng)目引用是通過dll文件傳遞的,包引用是通過nupkg文件傳遞的,
最大的區(qū)別是項(xiàng)目引用默認(rèn)不可以傳遞,而包引用默認(rèn)可以傳遞。

flowchart TD A1--項(xiàng)目引用-->A2 GA--包引用-->A3 GB1--包引用-->B2 GB1-.包引用.->B3 GB2--包引用-->B3 C1--項(xiàng)目引用-->C2 subgraph G1[單NuGet包項(xiàng)目] subgraph GA[NuGet包] direction TB A1[分析器項(xiàng)目] A2[NuGet包主項(xiàng)目] end A3[用戶項(xiàng)目] end subgraph G2[NuGet包傳遞] subgraph GB1[分析器NuGet包] B1[分析器項(xiàng)目] end subgraph GB2[NuGet包] B2[NuGet包項(xiàng)目] end B3[用戶項(xiàng)目] end subgraph G3[直接項(xiàng)目引用] C1[分析器項(xiàng)目] C2[用戶項(xiàng)目] end

注:首先需要確保引用的包支持.NET Standard 2.0。

直接項(xiàng)目引用

在很多時(shí)候只需要寫一個(gè)特化的源生成器供項(xiàng)目使用時(shí),會(huì)使用直接項(xiàng)目引用的方式。
此時(shí)我們將需要引用的dll路徑告訴分析器即可。

在csproj項(xiàng)目文件中用以下語句[1]即可實(shí)現(xiàn)這個(gè)功能(以System.Text.Json為例):

<ItemGroup>
    <PackageReference Include="System.Text.Json" Version="8.0.1" GeneratePathProperty="true" PrivateAssets="all" ReferenceOutputAssembly="false" />
</ItemGroup>

<PropertyGroup>
    <GetTargetPathDependsOn>$(GetTargetPathDependsOn);GetDependencyTargetPaths</GetTargetPathDependsOn>
</PropertyGroup>

<Target Name="GetDependencyTargetPaths">
    <ItemGroup>
        <TargetPathWithTargetPlatformMoniker Include="$(PkgSystem_Text_Json)\lib\netstandard2.0\*.dll" IncludeRuntimeDependency="false" />
    </ItemGroup>
</Target>

第一部分ItemGroup是引用包項(xiàng)目。其中:

  • PrivateAssets指定了這個(gè)依賴不會(huì)傳遞給用戶項(xiàng)目,如果需要傳遞的話,則無需指定這句;

  • ReferenceOutputAssembly是是否引用這個(gè)包,例如“NuGet包傳遞”模式中,也許只有分析器項(xiàng)目才需要使用這個(gè)包,NuGet包主項(xiàng)目并不需要它,即可指定這個(gè)屬性;

  • GeneratePathProperty是生成PkgSystem_Text_Json屬性,我們可以用$(PkgSystem_Text_Json)的方法去獲取這個(gè)包的dll所在路徑,規(guī)律是Pkg+包名,其中包名中的點(diǎn)替換為下劃線。

第二部分PropertyGroup是指定需要GetDependencyTargetPaths這個(gè)Target。

第三部分Target指定了GetDependencyTargetPaths具體如何實(shí)現(xiàn),即將告訴編譯器指定dll的路徑。

NuGet打包

但由于獲取的dll路徑是絕對(duì)路徑,在生成項(xiàng)目時(shí)就已經(jīng)決定了。
NuGet包絕大多數(shù)情況都和生成包的設(shè)備環(huán)境不同,此時(shí)上一個(gè)方法就失效了。

此時(shí)我們可以將需要的dll項(xiàng)目打包進(jìn)nupkg中:

這個(gè)功能(以System.Text.Json為例):

<ItemGroup>
    <PackageReference Include="System.Text.Json" Version="8.0.1" GeneratePathProperty="true" PrivateAssets="all" ReferenceOutputAssembly="false" />
    <None
        Include="$(PkgSystem_Text_Json)\lib\netstandard2.0\System.Text.Json.dll"
        Pack="true"
        PackagePath="analyzers\dotnet\cs\System.Text.Json.dll"
        Visible="false"
        CopyToOutputDirectory="PreserveNewest"/>
</ItemGroup>

一個(gè)解決方案有很多項(xiàng)目,那上面的問題應(yīng)該寫在哪呢?有一個(gè)很容易的判斷標(biāo)準(zhǔn):

寫在用戶項(xiàng)目引用的對(duì)象上。

舉例來說“NuGet包傳遞”中,NuGet包項(xiàng)目引用了分析器項(xiàng)目的nupkg后傳遞給了用戶項(xiàng)目,本質(zhì)上引用的是分析器項(xiàng)目(因?yàn)橛脩繇?xiàng)目也可以直接引用分析器項(xiàng)目NuGet包),所以我們應(yīng)該寫在分析器的csproj中。

“單NuGet包項(xiàng)目”中,NuGet包主項(xiàng)目會(huì)將分析器項(xiàng)目的dll包含進(jìn)輸出的nupkg中,所以我們應(yīng)該寫在NuGet包主項(xiàng)目的csproj中。

但這種方法會(huì)導(dǎo)致nupkg包變大,如果大家有更好的方法可以教我噢【


  1. GitHub Disscussion ??文章來源地址http://www.zghlxwxcb.cn/news/detail-807277.html

到了這里,關(guān)于分析器/源生成器添加項(xiàng)目依賴的方式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Elasticsearch 文本分析器(下)

    注意:字符過濾器用于在將字符流傳遞給分詞器之前對(duì)其進(jìn)行預(yù)處理 此過濾器會(huì)替換掉HTML標(biāo)簽,且會(huì)轉(zhuǎn)換HTML實(shí)體 如: 會(huì)被替換為 。 解析結(jié)果: 因?yàn)槭?p 標(biāo)簽,所以有前后的換行符。如果使用span標(biāo)簽就不會(huì)有換行符了。 可配參數(shù)說明 escaped_tags (可選,字符串?dāng)?shù)組)不包

    2024年02月08日
    瀏覽(48)
  • Elasticsearch 查詢分析器簡介

    Elasticsearch 是一個(gè)開源的分布式搜索和分析引擎,它提供了強(qiáng)大的查詢和分析功能。它基于 Apache Lucene 構(gòu)建,支持大規(guī)模數(shù)據(jù)的實(shí)時(shí)搜索,并具有高可用性和可擴(kuò)展性。 在 Elasticsearch 中,查詢分析器負(fù)責(zé)處理用戶搜索的輸入,將文本進(jìn)行分詞并生成倒排索引。分析器在搜索過

    2024年02月17日
    瀏覽(23)
  • Elasticsearch:搜索及索引分析器

    在我之前的文章 “Elasticsearch: analyzer”,我詳細(xì)介紹了在 Elasticsearch 中的分析器。分析器在 Elasticsearh 中,它在索引文檔的時(shí)候需要使用,同時(shí),它也在搜索時(shí),也需要針對(duì)搜索的文字進(jìn)行分詞。在今天的文章中,我們來詳細(xì)介紹分析器是如何在索引及搜索時(shí)使用的。 可以在

    2024年02月05日
    瀏覽(23)
  • ElasticSearch 基礎(chǔ)(七)之分析器

    ElasticSearch 基礎(chǔ)(七)之分析器

    就 ES 基礎(chǔ)部分來說這暫時(shí)就是最后一篇的文章,寫完之后就會(huì)學(xué)習(xí) MQ 了。本篇內(nèi)容簡單了解 ES 的分析器,最重要的還是根據(jù)自己需求去定制自定義分析器,自定義分析器自行了解,這里只是基礎(chǔ)。其他比較重要的就是中文分詞器了,只需要知道常用的幾種中文分詞器就可以

    2024年02月09日
    瀏覽(21)
  • 詞法分析器的設(shè)計(jì)與實(shí)現(xiàn)

    詞法分析器的設(shè)計(jì)與實(shí)現(xiàn)

    1.1、實(shí)驗(yàn)?zāi)康?????????加深對(duì)詞法分析器的工作過程的理解;加強(qiáng)對(duì)詞法分析方法的掌握;能夠采用一種編程語言實(shí)現(xiàn)簡單的詞法分析程序;能夠使用自己編寫的分析程序?qū)唵蔚某绦蚨芜M(jìn)行詞法分析。 1.2、實(shí)驗(yàn)要求 ? ? ? ? 1)對(duì)單詞的構(gòu)詞規(guī)則有明確的定義; ? ? ?

    2024年02月13日
    瀏覽(17)
  • Android Profiler 內(nèi)存分析器使用

    Android Profiler 內(nèi)存分析器使用

    Android Profiler是Android Studio的一部分,提供了一個(gè)集成的性能分析工具套件,包括內(nèi)存分析。Android Profiler 工具可提供實(shí)時(shí)數(shù)據(jù),幫助您了解應(yīng)用的 CPU、內(nèi)存、網(wǎng)絡(luò)和電池資源使用情況。 在Android Profiler中,您可以查看內(nèi)存使用情況的實(shí)時(shí)圖表、堆轉(zhuǎn)儲(chǔ)快照、分析內(nèi)存泄漏等,

    2024年02月08日
    瀏覽(21)
  • 編譯原理-6-LR語法分析器

    編譯原理-6-LR語法分析器

    自頂向下的、不斷歸約的、基于句柄識(shí)別自動(dòng)機(jī)的、適用于LR(?) 文法的、LR(?) 語法分析器 只考慮無二義性的文法 自底向上 構(gòu)建語法分析樹 根節(jié)點(diǎn) 是文法的起始符號(hào) S S S 每個(gè)中間 非終結(jié)符節(jié)點(diǎn) 表示 使用它的某條產(chǎn)生式進(jìn)行歸約 葉節(jié)點(diǎn) 是詞法單元$w$$ 僅包含終結(jié)符號(hào)與

    2024年02月05日
    瀏覽(52)
  • 編譯原理實(shí)驗(yàn)三:預(yù)測分析法語法分析器的設(shè)計(jì)

    編譯原理實(shí)驗(yàn)三:預(yù)測分析法語法分析器的設(shè)計(jì)

    ? 根據(jù)文法編制預(yù)測分析法語法分析程序,以便對(duì)輸入的符號(hào)串進(jìn)行語法分析。通過編寫預(yù)測分析法語法分析程序掌握預(yù)測分析法的基本原理、FIRST和FOLLOW集的計(jì)算、預(yù)測分析表的構(gòu)造方法以及語法分析法主控程序的設(shè)計(jì)。 對(duì)于給定的上下文無關(guān)文法,編程完成以下功能:

    2024年02月05日
    瀏覽(92)
  • 編譯原理詞法分析器(C/C++)

    編譯原理詞法分析器(C/C++)

    ? ? ? ? 詞法分析器不用多說,一開始我還不知道是什么樣的,看了下別人的博客,再看看書,原來是輸出二元組,這不就是字符串操作嘛。然后細(xì)看幾篇博客,發(fā)現(xiàn)大都是用暴力判斷來寫的。我對(duì)代碼重復(fù)性比較高的方法不太感冒,不是說我編程有多好,就是單純的不喜歡

    2024年02月06日
    瀏覽(87)
  • 【編譯原理】 實(shí)驗(yàn)一:詞法分析器的自動(dòng)實(shí)現(xiàn)(Lex詞法分析)

    【編譯原理】 實(shí)驗(yàn)一:詞法分析器的自動(dòng)實(shí)現(xiàn)(Lex詞法分析)

    相關(guān)代碼實(shí)操移步視頻 https://www.bilibili.com/video/BV13x4y1o7FL 1.借助詞法分析工具Flex或Lex完成(參考網(wǎng)絡(luò)資源) 2.輸入:高級(jí)語言源代碼(如helloworld.c) 3.輸出:以二元組表示的單詞符號(hào)序列。 通過設(shè)計(jì)、編制、調(diào)試一個(gè)具體的詞法分析程序,加深對(duì)詞法分析原理的理解,并掌握

    2024年02月08日
    瀏覽(95)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包