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


    本文告诉大家如何编写在编译过程修改打包文件

    在项目文件的相同文件夹可以放一个 nuspec 用来告诉 VisualStudio 如何打包

    现在尝试创建一个项目 NearjerbetearDeeyitoo ,在这个项目用来告诉大家如何使用替换占位符的方法

    在开始做之前需要告诉大家为什么需要使用这个方法

    因为写的 nuspec 文件是可以保持不动,在多个项目使用相同的一个 nuspec 文件,但是对不同的项目使用定制的方式,让项目自己输入在编译才能知道的变量,这样可以保持不修改 nusec 文件。

    先来创建一个 nuspec 文件,把这个文件随意一个文件名ReresouJesou.nuspec,如果在 VisualStudio 使用某个 nuspec 文件打包,就需要在项目文件添加下面代码

        <NuspecFile>ReresouJesou.nuspec</NuspecFile>
    
    

    为了在之后的打包过程可以添加一些变量,就需要修改项目文件

      <PropertyGroup>
        <TargetFramework>netstandard2.0</TargetFramework>
        <PackageId>NearjerbetearDeeyitoo</PackageId>
        <NuspecFile>ReresouJesou.nuspec</NuspecFile>
        <IsTool>True</IsTool>
      </PropertyGroup>
    

    需要稍微解释一下上面的代码,这里的 PackageId 实际上是我随意给的,大家可以替换PackageId为自己喜欢的字符串。在NuspecFile就需要指定nuspec文件所在的路径,这里用的是相对的路径。最后设置IsTool只是用来告诉安装 Nuget 的程序,这是一个工具 nuget 包没有引用。

    现在修改一下 ReresouJesou.nuspec 文件,添加下面代码

    <?xml version="1.0" encoding="utf-8"?>
    <package xmlns="http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd">
        <metadata>
            <id>$id$</id>
            <version>$version$</version>
            <authors>lindexi</authors>
            <owners>lindexi</owners>
            <developmentDependency>true</developmentDependency>
            <projectUrl>https://lindexi.github.io/lindexi</projectUrl>
            <description>这个文件告诉大家如何在编译修改占位字符</description>
        </metadata>
    </package>
    

    可以从上面代码看到和普通的 nuget 文件的不相同,第一个是id使用的是$id$ ,这里的id就是使用占位符,可以在项目文件使用 target 的方式替换占位符。

    上面代码有 id 和版本都使用占位符,下面就来写 target 来替换两个占位符为项目需要的字符。

      <Target Name="GenerateNuspecProperties" BeforeTargets="GenerateNuspec">
        <PropertyGroup>
          <NuspecProperties>
            $(NuspecProperties);
            id=$(PackageId);
            version=1.0;
            dll=$(TargetPath);
          </NuspecProperties>
        </PropertyGroup>
      </Target>
    

    写一个 Target 需要给这个 Target 一个命名,还需要告诉 VisualStudio 在什么的时候才使用这个 Target 这里是在创建 nuget 文件的时候才使用。

    这里通过定义 nuget 属性的方式用来替换。

    替换的语法是 占位符 = 字符串; 的方法,因为这里的字符串可以使用 $(变量) 的方式,所以就可以用到刚才在上面定义的字符串。

    在属性的$(NuspecProperties);就是在有其他的 target 也使用了 NuspecProperties 不会被这个 target 覆盖。从上面的代码可以看到我多设置了一个dll的字符串,在nuget文件是不存在这个dll字符串,但是也没有问题。

    但是可以多设置 nuget 文件不使用的字符串,不可以少设置 nuget 文件存在的字符串,不然就可能出现下面的代码

    错误		值不能为 null 或空字符串。
    	NuGet.Build.Tasks.PackuildNuGet.Build.Tasks.Pack.targets	
    
    

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

    更多关于 Roslyn 请看 手把手教你写 Roslyn 修改编译

    参见:专栏:Roslyn 入门 - CSDN博客

    NuGet pack and restore as MSBuild targets

    我搭建了自己的博客 https://blog.lindexi.com/ 欢迎大家访问,里面有很多新的博客。只有在我看到博客写成熟之后才会放在csdn或博客园,但是一旦发布了就不再更新

    如果在博客看到有任何不懂的,欢迎交流,我搭建了 dotnet 职业技术学院 欢迎大家加入

    知识共享许可协议
    本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系

  • 相关阅读:
    替换OSD操作的优化与分析
    Centos7下Jewel版本radosgw服务启动
    如何统计Ceph的RBD真实使用容量
    Ceph中的Copyset概念和使用方法
    Proftp最简匿名访问配置
    Windows could not set the offline local information.Error code:0X80000001解决方法
    《一百岁感言》 杨绛
    取扑克牌的问题
    马云的懒人理论
    明代地图总目
  • 原文地址:https://www.cnblogs.com/lindexi/p/12086957.html
Copyright © 2020-2023  润新知