Posts
MethodBoundaryAspect.Fody - Altering method behavior
MethodBoundaryAspect.Fody 要修改方法的回傳值,可在 OnExit 方法實作時透過 MethodExecutionArgs.ReturnValue 屬性填入新的方法值。
像是如果要撰寫一個可將方法回傳值變大寫的 Attribute 的話,可像下面這樣撰寫。
using MethodBoundaryAspect.Fody.Attributes; namespace MethodBoundaryAspect.Fody.Demo { public sealed class UpperAttribute : OnMethodBoundaryAspect { public override void OnExit(MethodExecutionArgs args) { args.ReturnValue = (args.ReturnValue as string).ToUpper(); } } } 在要做大寫轉換的方法上加掛 Attribute。
using System; namespace MethodBoundaryAspect.Fody.Demo { class Program { [Log] static void Main(string[] args) { Console.WriteLine(GetData()); } [Upper] static string GetData() { return "hello world!"; } } } 程式在編譯時即會加掛對應的處理,方法運行後可看到回傳值會被轉為大寫。
read morePosts
MethodBoundaryAspect.Fody - A Fody weaver which allows to decorate methods and hook into method start, method end and method exceptions
MethodBoundaryAspect.Fody 能透過 Fody 在程式編譯時將進出方法與方法丟出錯誤時的處理掛入系統中。
使用時需先引用 MethodBoundaryAspect.Fody 套件。
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>netcoreapp2.2</TargetFramework> </PropertyGroup> <ItemGroup> <PackageReference Include="MethodBoundaryAspect.Fody" Version="2.0.113" /> </ItemGroup> </Project> 然後加入 FodyWeavers.xml 檔,指示 Fody 要使用 MethodBoundaryAspect。
<?xml version="1.0" encoding="utf-8"?> <Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd"> <MethodBoundaryAspect /> </Weavers> 接著開一個 Attribute 類別繼承 OnMethodBoundaryAspect,在 OnEntry 撰寫方法進入時的處理、OnExit 撰寫方法離開時的處理、OnException 撰寫方法發生例外時的處理。
using System; using MethodBoundaryAspect.Fody.Attributes; namespace MethodBoundaryAspect.Fody.Demo { public sealed class LogAttribute : OnMethodBoundaryAspect { public override void OnEntry(MethodExecutionArgs args) { Console.WriteLine("OnEntry..."); } public override void OnExit(MethodExecutionArgs args) { Console.
read morePosts
ModuleInit.Fody - Adds a module initializer to an assembly
ModuleInit.Fody 能透過 Fody 在程式編譯時將初始化處理掛入系統程式中,能在系統一開始運行時做初始的動作。
使用時需先引用 ModuleInit.Fody 套件。
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>netcoreapp2.2</TargetFramework> </PropertyGroup> <ItemGroup> <PackageReference Include="ModuleInit.Fody" Version="2.0.0" PrivateAssets="All" /> </ItemGroup> </Project> 然後加入 FodyWeavers.xml 檔,檔案內容如下,指示 Fody 要使用 ModuleInit。
<?xml version="1.0" encoding="utf-8"?> <Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd"> <ModuleInit /> </Weavers> 接著在 ModuleInitializer 的 Initialize 方法撰寫初始化的部分。
運行後可看到程式會在啟動時先運行初始化程式。
Link Fody/ModuleInit: Adds a module initializer to an assembly
read morePosts
MethodTimer.Fody - Injects some very basic method timing code
MethodTimer.Fody 能透過 Fody 在程式編譯時將用來計算時間的程式放入掛有 TimeAttribute 的方法。
使用時需先引用 MethodTimer.Fody 套件。
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>netcoreapp2.2</TargetFramework> </PropertyGroup> <ItemGroup> <PackageReference Include="MethodTimer.Fody" Version="3.0.0" PrivateAssets="All" /> </ItemGroup> </Project> 然後加入 FodyWeavers.xml 檔,檔案內容如下,指示 Fody 要使用 MethodTimer。
<?xml version="1.0" encoding="utf-8"?> <Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd"> <MethodTimer /> </Weavers> 接著在 MethodTimeLogger 的 Log 方法撰寫時間計算的部分。
using System; using System.Reflection; namespace Fody.MethodTimer { public static class MethodTimeLogger { public static void Log(MethodBase methodBase, long milliseconds, string message) { Console.WriteLine($"[{methodBase.DeclaringType.Name}.{methodBase.Name}] {message} {milliseconds} ms"); } } } 然後在要計算時間的部分加掛 TimeAttribute,TimeAttribute 可掛在方法、類別、模組上,掛上時可順帶帶入對應的訊息。
read morePosts
migrate - Force set version without run migration
migrate 的 force 命令可不運行 migration 就強制設定版本。
像是筆者這邊有個沒套過 migration 的資料庫。
migrate -source $source -database $database version 筆者強制設定資料庫版本。
migrate -source $source -database $database force $version 資料庫版本就會被強制設為指定的版本。
migrate -source $source -database $database version
read morePosts
>-
SchemaSync 使用方式如下:
schemasync [options] <source> <target> # source/target format: mysql://user:pass@host:port/database # output format: <database>[_<tag>].YYYYMMDD.(patch|revert)[_<version>].sql -h, --help show this help message and exit -V, --version show version and exit. -r, --revision increment the migration script version number if a file with the same name already exists. -a, --sync-auto-inc sync the AUTO_INCREMENT value for each table. -c, --sync-comments sync the COMMENT field for all tables AND columns --tag=TAG tag the migration scripts as <database>_<tag>.
read morePosts
SchemaSync - Installing the latest development version
要安裝 SchemaSync 最新的開發版,先將 SchemaSync 用 git clone 下來。
git clone git://github.com/mmatuson/SchemaSync.git 然後切到 clone 下來的目錄。
cd SchemaSync 透過 Python 調用 setup.py 進行安裝。
sudo python setup.py install 安裝完可調用命令查驗版本,確認安裝無誤。
schemasync -V Link Schema Sync a MySQL Schema Versioning and Migration Utility
read morePosts
State/Migration driven database delivery
資料庫在做版本控制可被分為 State-driven 與 Migration-driven 兩種方式。
State-driven State-driven 的做法是在開發時持續的去維護資料庫的快照,資料庫的快照主要用 Create database/table/procedure 這些語法撰寫,描述該版本資料庫的樣子。
部署時會去針對目的資料庫或其對應的快照進行比對,產生部署腳本,最後在目的資料庫運行部署腳本即可。要重現某一版本的資料庫的話,只要將對應版本的資料庫快照從版本控制系統中取出,將之做為目的資料庫快照就可以了。
使用 State-driven 的好處有:
維護資料庫快照易於了解該版資料庫的內容 現成的 Data modeling 工具可輔助,便於設計溝通 如果未使用 Data modeling 工具或是使用的 Data modeling 工具儲存格式非二進制檔的話,因為主要都是修改相同檔案的 Create database/table/procedure 語法,衝突發生時會易於排除 缺點有:
比較受限於工具支援程度 彈性受限,如考慮資料部份,在某些情境可能還是會搭配 Migration 腳本 Migration-driven Migration-driven 方法則是在維護變更,主要用 Create/Alter 語法撰寫,用來描述這次修改所需要對資料庫的變更。
部署上只要直接對資料庫運行 Migration 腳本即可。若是要重現某版資料庫,只要將 Migration 從版本控制系統中取出,然後逐一從第一個 Migration 運行到指定版本的 Migration 就可以了。
使用 Migration-driven 的好處有:
彈性較大,資料的部份也可以處理 文字編輯工具即可撰寫,不受限於工具 缺點有:
因為是維護變更,開發上都是撰寫用來疊加的 Migration,從 Migration 不易了解該版資料庫的樣子 在多人維護下 Migration 易互相衝突 Link State vs migration-driven database delivery Critiquing two different approaches to delivering databases: Migrations vs state
read morePosts
migrate - Getting started
migrate 安裝後可調用命令查閱 CLI 使用方式。
migrate -help 使用方式如下:
Usage: migrate OPTIONS COMMAND [arg...] migrate [ -version | -help ] Options: -source Location of the migrations (driver://url) -path Shorthand for -source=file://path -database Run migrations against this database (driver://url) -prefetch N Number of migrations to load in advance before executing (default 10) -lock-timeout N Allow N seconds to acquire database lock (default 15) -verbose Print verbose logging -version Print version -help Print usage Commands: create [-ext E] [-dir D] [-seq] [-digits N] [-format] NAME Create a set of timestamped up/down migrations titled NAME, in directory D with extension E.
read morePosts
migrate - Install migrate CLI on Linux (*.deb package)
要在 Linux 上安裝 migrate,先將 migrate 的金鑰加入。
curl -L https://packagecloud.io/golang-migrate/migrate/gpgkey | apt-key add - 將 migrate 加入套件來源清單。
echo "deb https://packagecloud.io/golang-migrate/migrate/ubuntu/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/migrate.list 更新套件清單。
apt-get update 進行 migrate 套件安裝。
apt-get install -y migrate 最後調用命令查閱 migrate 版本,確認安裝無誤。
migrate -version Link migrate CLI
read more