build 之前执行task_浅谈VS编译自定义编译任务—MSBuild Task(csproject)-阿里云开发者社区...
在上一篇淺談.NET編譯時注入(C#-->IL)中我們簡單的反編譯查看了幾種c#語法糖和PostSharp在編譯成IL時為我做的MSIL注入。緊接著在這節,要來看的就是MSBuild Task。在我們的代碼預編譯過程中我們可以創建我們自己的任務Task。下面我們就開始做一個簡單的Task。
1:首先需要添加Microsoft.Build.Utilities.v3.5.dll和Microsoft.Build.Framework.dll中引用。在Microsoft.Build.Framework中為我們定義了接口ITask,自定義任務需要去實現這個契約。其定義如下:
publicinterface?ITask
{
IBuildEngine?BuildEngine?{?get;set;?}
ITaskHost?HostObject?{?get;set;?}
boolExecute();
}
IBuildEngine 從字義上說是編譯引擎,他主要承載了我們的編譯生成時的信息和消息,警告,錯誤等事件注冊。而Execute這是我們Task執行體。HostObject 任務關聯宿主信息。
在Microsoft.Build.Utilities下Task為我們實現了基本的ITask信息。我們可以從這里繼承開始。
下面是一個簡單的實現:
using?System;
using?System.Collections.Generic;
using?System.Linq;
using?System.Text;
namespace?FirstBuildTask
{
publicclass?MyBuildTask?:?Microsoft.Build.Utilities.Task
{
private?string?outputFile;
[Microsoft.Build.Framework.Required]
publicstring?OutputFile
{
get?{returnoutputFile;?}
set{?outputFile?=?value;?}
}
publicoverride?boolExecute()
{
Log.LogWarning("test?message:"+?this.outputFile);
returntrue;
}
}
}
下面我們需要關聯Task,本人不喜歡污染,所以加到csproject(也可全局所有項目使用)。
下面我們創建一個簡單的控制臺
程序
using?System;
using?System.Collections.Generic;
using?System.Linq;
using?System.Text;
namespace?BlogSample
{
class?Program
{
staticvoid?Main(string[]?args)
{
Console.WriteLine("ok");
Console.Read();
}
}
}
用記事本形式打開csproject文件:
添加我們的Task聲明和任務。(xml標記含義將在后續,這里先看看效果。)
聲明Task:
添加任務:
修改后的csproject文件形如:
上邊紅線注釋的就是我們的Task所做的警告和輸出路徑的提示。
我們已經完成了一個簡單Task,但還遺留這MsBuild配置,下面將簡單的描述。
1:UsingTask:定義:
屬性
說明
AssemblyName
AssemblyName?或?AssemblyFile?屬性是必需的。
要加載的程序集的名稱。盡管?AssemblyName?屬性不是必需的,但它接受強名稱程序集。使用此屬性等效于通過 .NET Framework 中的?Load?方法加載程序集。
如果使用了?AssemblyFile?屬性,便不能使用此屬性。
AssemblyFile
AssemblyName?或?AssemblyFile?屬性是必需的。
程序集的文件路徑。此屬性既接受完整路徑,也接受相對路徑。相對路徑是相對于當前項目目錄的路徑。使用此屬性等效于通過 .NET Framework 中的?LoadFrom?方法加載程序集。
如果使用了?AssemblyName?屬性,便不能使用此屬性。
TaskName
必選的屬性。
要從程序集中引用的任務的名稱。如果可能存在多義性,則此屬性應該始終指定完整的命名空間。如果存在多義性,MSBuild 將選擇任意匹配方式,該匹配方式可能產生意外的結果。
Condition
可選的屬性。
要計算的條件。有關更多信息,請參見?MSBuild 條件。
在系統中為我們定義了很多Task,有:
AL(程序集鏈接器)任務:描述?AL?任務及其參數。
AspNetCompiler 任務:包裝 aspnet_compiler.exe,它是預編譯 ASP.NET 應用程序的實用工具。
Copy 任務:描述?Copy?任務及其參數。
CreateItem 任務:描述?CreateItem?任務及其參數。
CreateProperty 任務:描述?CreateProperty?任務及其參數。
Csc 任務:描述?Csc?任務及其參數。
Delete 任務:描述?Delete?任務及其參數。
Error 元素 (MSBuild):根據計算的條件語句停止生成操作并記錄錯誤。
Exec 任務:描述?Exec?任務及其參數。
FindUnderPath 任務:確定指定項集合中的哪些項存在于指定的文件夾及其所有子文件夾中。
GenerateApplicationManifest 任務:描述?GenerateApplicationManifest?任務及其參數。
GenerateBootstrapper 任務:提供一種自動化方式來檢測、下載和安裝應用程序及其必備組件。
GenerateDeploymentManifest 任務:描述?GenerateDeployManifest?任務及其參數。
GenerateResource 任務:將 .txt 和 .resx 文件轉換為公共語言運行庫二進制 .resources 文件。
GetAssemblyIdentity 任務:從指定的文件檢索程序集標識并輸出標識信息。
GetFrameworkPath 任務:檢索 .NET Framework 程序集的路徑。
GetFrameworkSdkPath 任務:檢索 .NET Framework SDK 的路徑。
LC 任務:描述?LC?任務及其參數。
MakeDir 任務:描述?MakeDir?任務及其參數。
MSBuild 任務:描述 MSBuild 任務及其參數。
RegisterAssembly 任務:描述?RegisterAssembly?任務及其參數。
RemoveDir 任務:描述?RemoveDir?任務及其參數。
ResGen 任務:描述?ResGen?任務及其參數。
ResolveAssemblyReference 任務:描述?ResolveAssemblyReference?任務及其參數。
ResolveComReference 任務:描述?ResolveCOMReference?任務及其參數。
SGen 任務:為指定程序集中的類型創建一個 XML 序列化程序集。
SignFile 任務:使用指定證書對指定文件進行簽名。
Touch 任務:描述?Touch?任務及其參數。
UnregisterAssembly 任務:描述?UnregisterAssembly?任務及其參數。
Vbc 任務”描述?Vbc?任務及其參數。
VCBuild 任務“描述?VCBuild?任務及其參數。
Warning 元素 (MSBuild):根據計算的條件語句在生成期間記錄警告。
2:Target:定義
...
描述了我們的目標:可以包含0個多個任務。
屬性
屬性
說明
Name
必選的屬性。
目標的名稱。
DependsOnTargets
可選的屬性。
在執行此目標或者進行頂級依賴項分析之前必須執行的目標。多個目標之間用分號分隔。
Inputs
可選的屬性。
此目標的項輸入。此屬性中的項用作頂級依賴項分析中的輸入。
Outputs
可選的屬性。
此目標的預期輸出。可以通過對輸入項應用轉換來生成輸出項。有關轉換的更多信息,請參見?MSBuild 轉換。
Condition
可選的屬性。
要計算的條件。如果條件的計算結果為?false,目標將不會執行該目標的體或者在?DependsOnTargets?屬性中設置的任何目標的體。有關條件的更多信息,請參見?MSBuild
參考文獻:
本文轉自 破狼 51CTO博客,原文鏈接:http://blog.51cto.com/whitewolfblog/835134,如需轉載請自行聯系原作者
總結
以上是生活随笔為你收集整理的build 之前执行task_浅谈VS编译自定义编译任务—MSBuild Task(csproject)-阿里云开发者社区...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python实现英文新闻摘要自动提取_A
- 下一篇: docker privileged作用_