zoukankan      html  css  js  c++  java
  • 2019-7-29-Roslyn-使用-Target-替换占位符方式生成-nuget-打包

    title author date CreateTime categories
    Roslyn 使用 Target 替换占位符方式生成 nuget 打包
    lindexi
    2019-7-29 10:1:18 +0800
    2018-07-24 20:34:29 +0800
    Roslyn MSBuild 编译器 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.PackbuildNuGet.Build.Tasks.Pack.targets	
    

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

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

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

    NuGet pack and restore as MSBuild targets

  • 相关阅读:
    贝叶斯推断祭
    libstdc和glibc的一些共享库问题
    nf_conntrack之解决方案
    Too many open files 问题
    Centos系统 上下文切换的检查思路
    GPS坐标转大地坐标
    【转】关于IAP与APP互相跳转的实现
    stm32定时器计数功能
    C库函数——字符串转数字整理
    【转】sscanf函数用法实例
  • 原文地址:https://www.cnblogs.com/lindexi/p/12085737.html
Copyright © 2011-2022 走看看