clojureと呼ばれるプログラミング言語用のカスタムプロジェクトタイプ(csprojではなくcljproj)を作成しました。プロジェクトがコンパイルされると、複数の.dllファイルといくつかの依存する.cljファイルが出力されます。
これは、cljprojファイルのデフォルトのCoreCompileターゲットをオーバーライドすることによって行われます。これは基本的に、コンパイルが必要なすべてのファイルをbinディレクトリにコピーしてから、別のアプリを実行してコンパイルします。
<Target Name="CoreCompile">
<PropertyGroup>
<ClojureNamespaces>@(Compile -> '%(RelativeDir)%(Filename)', ' ')</ClojureNamespaces>
</PropertyGroup>
<Copy SourceFiles="@(Compile)" SkipUnchangedFiles="true" OverwriteReadOnlyFiles="true" DestinationFiles="@(Compile -> '$(OutDir)%(RelativeDir)%(Filename)%(Extension)')" />
<Exec WorkingDirectory="$(OutDir)" Command=""$(ClojureRuntimesDirectory)\$(ClojureVersion)\Clojure.Compile" $(ClojureNamespaces.Replace('\', '.'))" />
</Target>
ac#プロジェクト(csproj)からclojureプロジェクト(cljproj)への参照を追加しました。
<ProjectReference Include="..\Clojure ASP.Net MVC Controller Library1\Clojure ASP.Net MVC Controller Library1.cljproj">
<Project>{8fe1995b-4b6d-4911-b563-a759467fdf53}</Project>
<Name>Clojure ASP.Net MVC Controller Library1</Name>
</ProjectReference>
Visual Studioは、出力が1つ、Clojure ASP.Net MVCコントローラーLibrary1.dllのみであると想定しているため、デフォルトではプロジェクト参照を正しく解決しません。実際の出力ファイルの例は、MvcApplication1.Controllers.HomeController.dllおよびHomeController.cljです。
C#の.csprojファイルに変更を加えずにこの作業を行い、.cljprojを任意の.csprojファイルから簡単に参照できるようにしたいと思います。
プロジェクト参照を解決するための私の試みは、GetTargetPathターゲットをオーバーライドすることです。
<Target Name="GetTargetPath" DependsOnTargets="$(GetTargetPathDependsOn)" Returns="@(TargetPath)">
<ItemGroup>
<TargetPath Include="$(TargetDir)\**\*.dll" />
<!-- <TargetPath Include="$(TargetDir)\**\*.clj" /> -->
</ItemGroup>
</Target>
* .dllを使用してTargetPathを設定すると、それが機能し、.dllファイルがc#.csproj出力ディレクトリにコピーされます。TargetPathには追加しませんでしたが、.pdbファイルをそのディレクトリにコピーすることもできます。ただし、*。clj TargetPathのコメントを外すと、CSCは.cljファイルが破損していると文句を言います(おそらく、.netアセンブリではなくプレーンテキストであるため)。
TargetPathをオーバーライドする代わりにコピーコマンドを使用できてうれしいですが、$(outdir)はカスタムプロジェクト(.cljproj)のビンを提供しないため、ディレクトリに出力する変数を使用するかどうかはわかりません。プロジェクト参照(.csproj)を解決しようとしているc#プロジェクトのビン。ほとんどのclojureプロジェクト(.cljproj)ターゲットは、c#(.csjproj)プロジェクトのコンパイル時に呼び出されないため、GetTargetPath以外にオーバーライドする他のターゲットがわかりません。たとえば、.cljproj:AfterBuildは、cljprojを直接コンパイルするときにのみ呼び出されます。 .cljprojへのプロジェクト参照を持つ.csprojをコンパイルするときではありません。