2013-03-15 101 views
1

我爲一種名爲clojure的編程語言創建了自定義項目類型(cljproj而不是csproj)。當項目編譯時,它會輸出多個.dll文件以及一些相關的.clj文件。Msbuild將項目引用解析爲自定義項目類型

這是通過覆蓋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> 

我添加了從c#項目(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默認情況下無法正確解析項目引用,因爲它假設只會有一個輸出,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,它的工作原理和.dll文件複製到C#的.csproj輸出目錄設置TARGETPATH。它甚至將.pdb文件複製到該目錄,但我沒有將它們添加到TargetPath。但是,如果我取消註釋* .clj TargetPath,CSC會抱怨.clj文件已損壞(可能是因爲它們是純文本而不是.net程序集)。

我很高興使用複製命令而不是覆蓋TargetPath,但是我不確定使用哪個變量來將目錄輸出到目錄,因爲$(outdir)給了我自定義項目的bin( .cljproj)不是試圖解析項目引用(.csproj)的c#項目的bin。我不確定除了GetTargetPath之外還有哪些其他目標需要重寫,因爲在編譯c#(.csjproj)項目時不會調用大多數clojure項目(.cljproj)目標,例如:.cljproj:僅在直接編譯cljproj時調用AfterBuild,而不是在編譯.csproj時有一個對.cljproj的項目引用。

回答

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> 
相關問題