ページ「Nancy/Minify & Bundleを使う」と「Xamarin.MacでNLogを使う」の間の差分

提供: MonoBook
< Nancy(ページ間の差分)
ナビゲーションに移動 検索に移動
 
imported>Administrator
(Administrator がページ「Xamarin.Mac/NLogを使う」を「Xamarin.MacでNLogを使う」に移動しました)
 
1行目: 1行目:
ASP.NET 4から搭載されたMinify & Bundleを[[Mac]]上の[[Mono]]とNancyから使ってみる。
+
[[Xamarin.Mac]]でも[[NLog]]を使えると捗る。
リリースビルドするとJavaScriptやCSSから無駄が省かれるという機能である。
 
  
[[Linux]]なら[[mod_pagespeed]]で良いじゃんというツッコミは禁止である。
+
==実装1==
あれはコンパイルが難しいというか配布サーバーが不安定すぎて泣ける。
+
[[Xamarin.Mac]]でも[[NLog]]はなんら問題なく使用できる。[[NuGet]]から一発[[インストール]]である。試してはいないが[[MonoMac]]でも同じだと思う。
  
==静的コンテンツを扱えるようにする==
+
ただし[[ファイル]]に出力する場合に注意が必要で、[[Mac OS X]]ではあらゆる[[ファイル]]は[[アプリ]]の外部に保存する必要があるため、NLog.configファイルの設定例でよく見かける「basedir変数」以下に書き込む設定は使えない。
なにはともあれNancyで静的コンテンツを使える状態にする。
 
*[[Nancy/静的コンテンツを扱う]]
 
  
==NuGetから必要なパッケージを入れる==
+
===ファイルに出力するNLog.configの設定例===
[[ASP.NET]]関連のほとんどが、いつの間にか[[ASP.NET]]本体から分離されて[[NuGet]]へ移行している。[[Linux]]上の[[Mono]]でも[[ASP.NET]]を使えという思し召しらしい。[[Xamarin Studio]]からも一発で入る。
+
そこで以下の例では[[Mac OS X]]では定番の「~/Library/Logs/」以下に出力してみた。
*https://www.nuget.org/packages/Microsoft.AspNet.Web.Optimization/
 
  
==web.configを編集==
+
<source lang="xml">
<pre>
+
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
+
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
  <configSections>
+
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      <!--  追加 -->
+
      xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
       <section name="razor" type="Nancy.ViewEngines.Razor.RazorConfigurationSection, Nancy.ViewEngines.Razor" />
+
      autoReload="true"
       <!--  追加 -->
+
      throwExceptions="false"
  </configSections>
+
       internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log" >
  
   <!--  追加 -->
+
   <variable name="appname" value="monobook"/>
  <razor disableAutoIncludeModelNamespace="false">
 
    <assemblies>
 
      <add assembly="System.Web.Optimization" />
 
      <add assembly="System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
 
    </assemblies>
 
    <namespaces>
 
      <add namespace="System.Web.Optimization" />
 
    </namespaces>
 
  </razor>
 
  <!--  追加 -->
 
  
   <system.webServer>
+
   <targets>
     <!--  追加 -->
+
     <target xsi:type="File" name="logfile"  
    <modules runAllManagedModulesForAllRequests="true"
+
    fileName="${specialfolder:folder=MyDocuments}/Library/Logs/${appname}/${shortdate}.log"
      <remove name="BundleModule" /> 
+
        layout="${longdate} ${uppercase:${level}} ${message}" />
      <add name="BundleModule" type="System.Web.Optimization.BundleModule" /
 
    </modules>
 
    <!--  追加 -->
 
  </system.webServer>
 
</configuration>
 
</pre>
 
  
==バンドルを登録する==
+
    <target xsi:type="Console" name="console" />
どこでもいいので登録内容が記述されたメソッドを作る。
 
純正に右に倣えで「App_Start/BundleConfig.cs」にしておくと無難だと思われる。
 
<source lang="csharp">
 
using System;
 
using System.Web.Optimization;
 
  
namespace Test
+
  </targets>
{
+
 
     public class BundleConfig
+
  <rules>
     {
+
     <logger name="*" minlevel="Trace" writeTo="logfile" />
        public static void RegisterBundles(BundleCollection bundles)
+
     <logger name="*" minlevel="Info" writeTo="console" />
        {
+
  </rules>
            bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
+
</nlog>
                "~/Scripts/jquery-{version}.js"));
 
        }
 
    }
 
}
 
 
</source>
 
</source>
 +
NLogに設定するパスは[[絶対パス]]なので、ホームディレクトリのパスの取得は「[[MonoMac/特殊ディレクトリのパスを取得する]]」を用いてMyDocumentsを指定することで取得した。
  
サーバー起動時に登録する。
+
また、NLog.config中でアプリ名を動的に取得する方法がわからなかったので、この例では自前でappname変数を用意している。
Global.asax.cs(無ければ作る)のApplication_Startメソッドから上記の登録メソッドを呼び出す。
 
<source lang="csharp">
 
using System;
 
using System.Web.Optimization;
 
  
namespace Test
+
===備考===
{
+
NLog.configは初期状態でビルド時にコピーされない設定になっていると思うので修正するのを忘れないこと。NLog.configファイルのプロパティの「出力ディレクトリにコピー」の値を「新しい場合のみコピー」または「常にコピー」に設定する。
    public class Global : System.Web.HttpApplication
+
 
    {
+
===不具合===
        protected void Application_Start(Object sender, EventArgs e)
+
これは2015年8月3日の情報です。
        {
+
[[Xamarin.Mac]]において「Debugビルド」を行うとアプリ内(***.app内)のMonoBundleディレクトリにNLog.configファイルが生成(コピー)されるが、「Releaseビルド」では生成されないようだ。たぶん[[不具合]]だと思う。
            BundleConfig.RegisterBundles(BundleTable.Bundles);
+
 
        }
+
==関連項目==
    }
+
*[[MonoMac/特殊ディレクトリのパスを取得する]]
}
 
</source>
 
  
==Scripts.Renderの違い==
+
==参考文献==
ASP.NET 4で標準の記述方法が使えない。
+
{{reflist}}
@Scripts.Render("~/bundles/jquery")
 
以下を使うことで代用する。
 
@Html.Raw(Scripts.Render("~/bundles/jquery").ToString())
 
ToStringを忘れると[[Razor]]が落ちる。凄い嵌った。
 
  
 
{{stub}}
 
{{stub}}
 +
 +
[[category:Xamarin.Mac]]
 +
[[category:MonoMac]]

2019年5月22日 (水) 05:13時点における最新版

Xamarin.MacでもNLogを使えると捗る。

実装1[編集 | ソースを編集]

Xamarin.MacでもNLogはなんら問題なく使用できる。NuGetから一発インストールである。試してはいないがMonoMacでも同じだと思う。

ただしファイルに出力する場合に注意が必要で、Mac OS Xではあらゆるファイルアプリの外部に保存する必要があるため、NLog.configファイルの設定例でよく見かける「basedir変数」以下に書き込む設定は使えない。

ファイルに出力するNLog.configの設定例[編集 | ソースを編集]

そこで以下の例ではMac OS Xでは定番の「~/Library/Logs/」以下に出力してみた。

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
      autoReload="true"
      throwExceptions="false"
      internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log" >

  <variable name="appname" value="monobook"/>

  <targets>
    <target xsi:type="File" name="logfile" 
    	fileName="${specialfolder:folder=MyDocuments}/Library/Logs/${appname}/${shortdate}.log"
        layout="${longdate} ${uppercase:${level}} ${message}" />

    <target xsi:type="Console" name="console" />

  </targets>

  <rules>
    <logger name="*" minlevel="Trace" writeTo="logfile" />
    <logger name="*" minlevel="Info"  writeTo="console" />
  </rules>
</nlog>

NLogに設定するパスは絶対パスなので、ホームディレクトリのパスの取得は「MonoMac/特殊ディレクトリのパスを取得する」を用いてMyDocumentsを指定することで取得した。

また、NLog.config中でアプリ名を動的に取得する方法がわからなかったので、この例では自前でappname変数を用意している。

備考[編集 | ソースを編集]

NLog.configは初期状態でビルド時にコピーされない設定になっていると思うので修正するのを忘れないこと。NLog.configファイルのプロパティの「出力ディレクトリにコピー」の値を「新しい場合のみコピー」または「常にコピー」に設定する。

不具合[編集 | ソースを編集]

これは2015年8月3日の情報です。 Xamarin.Macにおいて「Debugビルド」を行うとアプリ内(***.app内)のMonoBundleディレクトリにNLog.configファイルが生成(コピー)されるが、「Releaseビルド」では生成されないようだ。たぶん不具合だと思う。

関連項目[編集 | ソースを編集]

参考文献[編集 | ソースを編集]