6月 272017
 


新しい csproj でこれをやる話。

結論

VSProjectSystem/automatic_DependentUpon_wireup.md at master · Microsoft/VSProjectSystem · GitHub
これ参照。
地味にめんどい。

Static dependency

地道に指定する方法の例。

<Project Sdk="Microsoft.NET.Sdk">
  
  <PropertyGroup>
    <TargetFramework>netstandard1.4</TargetFramework>
  </PropertyGroup>
  
  <ItemGroup>
    <Compile Update="Hoge.*.cs">
      <DependentUpon>Hoge.cs</DependentUpon>
    </Compile>
    <Compile Update="Fuga\Fuga.*.cs">
      <DependentUpon>Fuga\Fuga.cs</DependentUpon>
    </Compile>
  </ItemGroup>
  
</Project>

Dynamic file dependency

ルールを作って動的に解析されるようにする方法の例。

<Project Sdk="Microsoft.NET.Sdk">
  
  <PropertyGroup>
    <TargetFramework>netstandard1.4</TargetFramework>
  </PropertyGroup>
  
  <ItemGroup>
    <PropertyPageSchema Include="$(MSBuildThisFileDirectory)ProjectItemsSchema.xaml" />
    <ProjectCapability Include="DynamicDependentFile" />
  </ItemGroup>
  
</Project>

<ProjectSchemaDefinitions xmlns="http://schemas.microsoft.com/build/2009/properties">
  
  <ContentType Name="PageXaml" DisplayName="XAML Page" ItemType="Page">
    <NameValuePair Name="DependentExtensions" Value=".xaml.cs" />
  </ContentType>
  
  <FileExtension Name=".xaml" ContentType="PageXaml" />
  
</ProjectSchemaDefinitions>

8月 112015
 

とりあえず簡単に。
ちゃんとしたのはそのうち気が向いたら書くかも。
でも既存開発者はわかってる人たちだからこれでも十分な気が……

新規開発も追々。
むしろちゃんと書くべきはこっち。。

KanColleViewer 4.0

KanColleViewer 4.0 がリリースされましたが、プラグインシステムが刷新されたため、3.x のプラグインは利用できなくなりました。

Release version 4.0 · Grabacr07/KanColleViewer

プラグイン システムの刷新 (version 3.8.2 またはそれ以前に向けて作られたプラグインは使用できなくなります)

というわけで、3.x プラグインをどう移行すればいいかを 雑に 簡単に説明します。

実際のコードは、本体に付属しているプラグインの実装などを参考にすると良いでしょう。

Continue reading »

7月 212015
 

仕様的な

  • Analyzer を使う際、Analyzer の依存アセンブリも Analyzer として参照追加する必要がある
    • 通常の参照追加じゃダメ
  • NuGet を用いた Analyzer のインストールは install.ps1 で行われる
  • RTM 版テンプレートの install.ps1 では、nupkg 解凍直下の analyzers ディレクトリにある dll を Analyzer として登録する
  • ので、上手いことそこにアセンブリが配置されるよう nuspec を書く必要がある
  • だがどうやら lib 配下以外に配置すると pack 時に怒られるので、-NoPackageAnalysis オプションが必要
  • この仕様では、Analyzer の依存アセンブリは同梱配布しかできないのではないか疑惑 (PowerShell頑張ればなんとかなるんだろうか)

とりあえずどうすればいいのか

  • csproj を使って nuget pack する前提の nuspec を書くパターン
  • bin\$configuration$\ 直下の dll を全部 analyzers ディレクトリに突っ込むようにする(Analyzer 開発用アセンブリは除外)
  • Analyzer が依存してるアセンブリの「ローカルにコピー」を True にして含まれるようにする
  • プロジェクト新規作成時点で指定されている packages.config の中身は開発時しか使わないので developmentDependency=”true” にして利用時の依存を除外

こんな感じ。

<?xml version="1.0"?>
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
  <metadata>
    <id>$id$</id>
    <title>$title$</title>
    <version>$version$</version>
    <authors>$author$</authors>
    <owners>$author$</owners>
    <licenseUrl>http://LICENSE_URL_HERE_OR_DELETE_THIS_LINE</licenseUrl>
    <projectUrl>http://PROJECT_URL_HERE_OR_DELETE_THIS_LINE</projectUrl>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>$description$</description>
    <language>ja-JP</language>
    <tags>analyzers</tags>
    <frameworkAssemblies>
    </frameworkAssemblies>
    <dependencies>
    </dependencies>
  </metadata>
  <files>
    <file src="bin\$configuration$\*.dll" target="analyzers\" exclude="**\Microsoft.CodeAnalysis.*;**\System.Collections.Immutable.*;**\System.Reflection.Metadata.*;**\System.Composition.*" />
    <file src="tools\*.ps1" target="tools\" />
  </files>
</package>

で、こう

[crayon]
nuget pack Hoge.csproj -NoPackageAnalysis -Properties Configuration=Release
[/crayon]

7月 102015
 

参照 : Damir’s Corner – Quick Guide to Unit Testing Diagnostic Analyzers

Visual Studio 2015 RC にて、.NET Compiler Platform SDK Templates for RC の「Analyzer with Code Fix」テンプレートで Analyzer 用のプロジェクトを作成すると、自動的にテストプロジェクトも生成されます。

んでもってこれを使ってテストコードを書くわけですが、どうやらここでテストコードに与えるソース文字列がコンパイル通らないコードだとテストに失敗することがあるようです。

で、アセンブリ参照が足りない場合なんかも同様にコケるわけですが、テストプロジェクトにアセンブリ参照を追加しても残念ながら参照してくれません。

ではどうすれば良いかというと、テストプロジェクトの Helpers/DiagnosticVerifier.Helper.cs 内の CreateProject メソッドにアセンブリ参照を追加している箇所があるので、そこに追加します。

public abstract partial class DiagnosticVerifier
{
//中略
    private static readonly MetadataReference KanColleViewerCompositionReference
        = MetadataReference.CreateFromAssembly(typeof(Grabacr07.KanColleViewer.Composition.IPlugin).Assembly);
    private static readonly MetadataReference SystemComponentModelCompositionReference
        = MetadataReference.CreateFromAssembly(typeof(System.ComponentModel.Composition.ExportAttribute).Assembly);
//中略
private static Project CreateProject(string[] sources, string language = LanguageNames.CSharp)
{
    string fileNamePrefix = DefaultFilePathPrefix;
    string fileExt = language == LanguageNames.CSharp ? CSharpDefaultFileExt : VisualBasicDefaultExt;

    var projectId = ProjectId.CreateNewId(debugName: TestProjectName);

    var solution = new AdhocWorkspace()
        .CurrentSolution
        .AddProject(projectId, TestProjectName, TestProjectName, language)
        .AddMetadataReference(projectId, CorlibReference)
        .AddMetadataReference(projectId, SystemCoreReference)
        .AddMetadataReference(projectId, CSharpSymbolsReference)
        .AddMetadataReference(projectId, CodeAnalysisReference)
        .AddMetadataReference(projectId, KanColleViewerCompositionReference)
        .AddMetadataReference(projectId, SystemComponentModelCompositionReference)
        ;

    int count = 0;
    foreach (var source in sources)
    {
        var newFileName = fileNamePrefix + count + "." + fileExt;
        var documentId = DocumentId.CreateNewId(projectId, debugName: newFileName);
        solution = solution.AddDocument(documentId, newFileName, SourceText.From(source));
        count++;
    }
    return solution.GetProject(projectId);
}
//以下略

これでアセンブリが参照されるようになり、テストが通るようになります。

これは RC 版でのテンプレートの問題なので、もしかしたら将来変更されるかもしれませんね。

7月 162014
 
6月 262014
 

VisualStudioの「テストの設定」>「配置」>「ディレクトリの追加」でディレクトリを追加しても、テスト時に配置されるのはディレクトリ自体ではなく、ディレクトリの中身という。。

ディレクトリ自体をコピーしたい場合、outputDirectory属性を指定すれば解決できる。

<?xml version="1.0" encoding="UTF-8"?>
<TestSettings name="TestSettings" id="dd694686-1380-4610-88cf-afef9af4ab17" xmlns="http://microsoft.com/schemas/VisualStudio/TeamTest/2010">
  <Description>これらはローカル テスト実行用の既定のテスト設定です。</Description>
  <Deployment>
    <DeploymentItem filename="UnitTest\Models\" outputDirectory="Models"/>
  </Deployment>

「テストの設定」からは操作できない属性だが、他のファイルやディレクトリを追加しても追記したoutputDirectoryは削除されない模様(VS2013 Update2)。

参考:方法: テスト用のファイルを配置する

6月 262014
 
  • 「NuGet パッケージの復元の有効化」を有効にしてる
  • プライベートリポジトリなどデフォルト以外のリポジトリを利用している

この時、PackageSourceを追加しないと復元に失敗する。
VisualStudioのオプションで追加している場合は成功するが、未設定環境では当然ながら失敗するため、設定をソースと一緒に配信したくなる。

追加できる場所で、容易にソースと一緒に配信できるのは以下のどちらか。

  • .nuget\NuGet.Config
    参照:NuGet Config Settings
  • .nuget\NuGet.targets
    <ItemGroup Condition=" '$(PackageSources)' == '' ">
    <!-- Package sources used to restore packages. By default, registered sources under %APPDATA%\NuGet\NuGet.Config will be used -->
    <!-- The official NuGet package source (https://www.nuget.org/api/v2/) will be excluded if package sources are specified and it does not appear in the list -->
    <!--
        <PackageSource Include="https://www.nuget.org/api/v2/" />
        <PackageSource Include="https://my-nuget-source/nuget/" />
    -->
    </ItemGroup>
    

  • ConfigではKeyの指定があるが、targetsにはない
  • Configは、%APPDATA%\NuGet\NuGet.Config等、他の同時に読み込まれるNuGet.Configの影響も受けてしまう
    • disabledPackageSourcesで当該キーのソースが指定されていると、無効化されてしまうため、注意が必要となる
    • VisualStudio のオプションでチェックボックスをオフにするとdisabledPackageSourcesに含まれてしまう
  • Reference の解説をさらっと見た限りではConfigの書き方しか書いてない
  • NuGetパッケージマネージャーをバージョンアップした時の影響は不明…
3月 132013
 

管理特権がないとダメらしい。
VisualStudioでのデバッグ実行時などはVisualStudioを[管理者として実行]すればOK。