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.Pack\build\NuGet.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 ),不得用於商業目的,基於本文修改後的作品務必以相同的許可發佈。如有任何疑問,請與我聯繫

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章