本文告訴大家如何編寫在編譯過程修改打包文件
在項目文件的相同文件夾可以放一個 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 修改編譯
NuGet pack and restore as MSBuild targets
我搭建了自己的博客 https://blog.lindexi.com/ 歡迎大家訪問,裏面有很多新的博客。只有在我看到博客寫成熟之後纔會放在csdn或博客園,但是一旦發佈了就不再更新
如果在博客看到有任何不懂的,歡迎交流,我搭建了 dotnet 職業技術學院 歡迎大家加入
本作品採用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議進行許可。歡迎轉載、使用、重新發布,但務必保留文章署名林德熙(包含鏈接:http://blog.csdn.net/lindexi_gd ),不得用於商業目的,基於本文修改後的作品務必以相同的許可發佈。如有任何疑問,請與我聯繫。