zoukankan      html  css  js  c++  java
  • 2019-11-29-Roslyn-打包自定义的文件到-NuGet-包

    title author date CreateTime categories
    Roslyn 打包自定义的文件到 NuGet 包
    lindexi
    2019-11-29 08:23:21 +0800
    2019-7-9 17:3:4 +0800
    Roslyn MSBuild 编译器 nuget 打包

    在使用 sdk 格式的项目文件支持快速进行打包,但使用这个方式打包的时候将默认只带程序集输出文件,而没有带依赖的文件。本文告诉大家如何在打包的时候加上需要放在包里面的文件

    VisualStudio 使用新项目格式快速打出 Nuget 包 告诉大家快速打包的方法,但有时候我需要将本地的一些资源或依赖也放在包里面,此时就需要用到下面的方法

    在项目里面引用的资源,可以通过在引用的时候添加 Pack 属性设置打包,使用 PackagePath 属性设置打包的时候放在包里面的哪个文件夹

    例如将项目里面引用的 林德熙是逗比.txt 打包放在 libdoubi 文件夹里面,可以这样写

    <None Include="林德熙是逗比.txt"
                      Pack="True"
                      PackagePath="libdoubi" />

    注意需要将 None 放在 ItemGroup 里面,请看代码

        <ItemGroup>
            <None Include="林德熙是逗比.txt"
                  Pack="True"
                  PackagePath="libdoubi" />	
        </ItemGroup>

    如果在这一行代码执行之前已经添加了引用这个文件,那么请将 Include 修改为 Update 请看下面代码

        <ItemGroup>
        	<None Include="*.txt"/>
        	<!-- 上面的代码使用 *.txt 包含了 林德熙是逗比.txt 文件,需要在下面代码使用更新 -->
            <None Update="林德熙是逗比.txt"
                  Pack="True"
                  PackagePath="libdoubi" />	
        </ItemGroup>

    而如果是引用了输出文件里面的某个 dll 如我引用了 Newtonsoft.Json.dll 这个库文件,我需要在 bin elease 文件夹里面引用文件,那么我将需要这样写

            <ItemGroup>
                <None Include="$(OutputPath)
    et48Newtonsoft.Json.dll"
                      Pack="True"
                      PackagePath="	ools
    et48Newtonsoft.Json.dll" />
            </ItemGroup>

    上面代码将会在输出文件夹找到 Newtonsoft.Json.dll 将这个文件输出到打包文件夹里面

    如果我是需要在运行过程引用的一些 C++ 运行库,那么同样可以上面方法

    另外在输出的时候也支持改名,例如在写 NuGet 的时候,在修改编译过程的 targets 和 props 文件是需要跟随包的名才能被执行。例如在 Roslyn 通过 Target 修改编译的文件 写到的替换编译文件,此时要求对应的文件有规定的命名

    在 NuGet 里面,要求执行的 targets 文件必须满足命名要求,需要命名为 NuGet包id.targets 才会被执行,对应的 props 文件也相同

    如果是自己手写文件名,在更改 NuGet 包 id 的时候如果没有更改,或复制不对,那么会发现没有执行

    简单的解决方法是在打包的时候自动修改对应的文件包

    先在项目文件的 build 文件夹里面添加 package.targets 和 package.props 文件,在项目文件添加下面代码进行输出

    <None Include="buildpackage.targets" Pack="True" PackagePath="uild$(PackageId).targets" />
    <None Include="buildpackage.props" Pack="True" PackagePath="uild$(PackageId).props" />

    这样在输出的时候就会自动更改文件名

    如果这个库文件只是需要添加资源文件,不需要加上 lib 文件,也就是不添加引用,那么请设置这个项目作为工具库

        <IsTool>true</IsTool>
        <NoPackageAnalysis>true</NoPackageAnalysis>
        <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
        <NoBuild>true</NoBuild>
        <IncludeBuildOutput>false</IncludeBuildOutput>
    

    通过 IsTool 将不会在安装的项目引用编译的文件,也就是这个 NuGet 库只是工具,里面的 dll 不会被引用

    Roslyn 使用 Target 替换占位符方式生成 nuget 打包

    如何编写基于 Microsoft.NET.Sdk 的跨平台的 MSBuild Target(附各种自带的 Task) - walterlv

    如何创建一个基于 MSBuild Task 的跨平台的 NuGet 工具包 - walterlv

    Roslyn 如何在 Target 引用 xaml 防止文件没有编译

    Roslyn 通过 Target 修改编译的文件

  • 相关阅读:
    日期操作
    sanchi
    502 Server dropped connection
    把项目挂载到composer上
    从composer上在本地创建一个项目
    初始化后,composer安装
    在项目目录初始化composer
    Linux安装composer
    linux网络编程之TCP/IP基础
    grep的用法
  • 原文地址:https://www.cnblogs.com/lindexi/p/12085413.html
Copyright © 2011-2022 走看看