1

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="&quot;$(ClojureRuntimesDirectory)\$(ClojureVersion)\Clojure.Compile&quot; $(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をコンパイルするときではありません。

4

1 に答える 1

2

GetCopyToOutputDirectoryItemsターゲットをオーバーライドすることで、それを機能させることができました。

<Target Name="GetCopyToOutputDirectoryItems" Returns="@(CopyToOutputDirectoryItemsWithTargetPath)">
  <ItemGroup>
    <CopyToOutputDirectoryItems Include="$(TargetDir)\**\*.clj">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </CopyToOutputDirectoryItems>
  </ItemGroup>
  <AssignTargetPath Files="@(CopyToOutputDirectoryItems)" RootFolder="$(TargetDir)">
    <Output TaskParameter="AssignedFiles" ItemName="CopyToOutputDirectoryItemsWithTargetPath" />
  </AssignTargetPath>
</Target>
于 2013-03-18T17:58:20.800 に答える