2010-08-23 2 views
14

Ich habe eine Reihe von XML- und XSLT-Zusatzdateien, die ich in Visual Studio bearbeiten und verwalten möchte.Gibt es so etwas wie ein "content/data only project" in Visual Studio?

Die Dateien gehören logischerweise nicht zu einem Code-Projekt in meiner Lösung. Um sie also ordentlich zu gruppieren, habe ich ein "dummy" C# dll-Projekt in Visual Studio erstellt und es in Debug/Release-Builds deaktiviert. .

Ich fragte mich, ob es eine bessere Möglichkeit gäbe, das gleiche Ergebnis zu erzielen (d. H. Alle Dateien im Lösungsexplorer sichtbar zu haben). Was ich wirklich will, ist ein visuelles Studioprojekt von "content only", aber so etwas gibt es nicht (oder habe ich nicht intensiv genug gesucht?).

Ich habe mit der Idee gespielt, die Dateien als Lösungselemente hinzuzufügen, aber sie scheinen schwieriger zu verwalten, da das Erstellen eines neuen "Lösungselementordners" tatsächlich keinen Ordner auf der Festplatte erstellt.

Irgendwelche Ideen?

Antwort

12

Ein Arbeitskollege hat sich eine Lösung ausgedacht.

Er hat vorgeschlagen, das Projekt manuell zu bearbeiten, um die DefaultTargets aus dem Projekt zu entfernen (und eine Ladung von jetzt nicht verwendeten Eigenschaften zu löschen).

MSBuild beschwert sich, wenn keine Ziele im Projekt vorhanden sind, daher hat er drei leere Ziele hinzugefügt.

Das endgültige Projekt so etwas wie dieses

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="3.5" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <PropertyGroup> 
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> 
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> 
    <ProductVersion>9.0.30729</ProductVersion> 
    <SchemaVersion>2.0</SchemaVersion> 
    <ProjectGuid>{541463A7-7CFA-4F62-B839-6367178B16BD}</ProjectGuid> 
    </PropertyGroup> 
    <ItemGroup> 
    ... files ... 
    </ItemGroup> 
    <ItemGroup> 
    ... files ... 
    </ItemGroup> 
    <Target Name="Build"/> 
    <Target Name="Rebuild"/> 
    <Target Name="Clean"/> 
</Project> 

Zwar sieht, erfordert diese Lösung das Hantieren, dass ich es mir gewünscht hätte, aber scheint zu erreichen, was ich war nach: nämlich ein Projekt, das nicht bauen zu produzieren ist aattempt Ausgabe.

+0

Gut zu wissen;) –

+2

Aktualisiert für VS2013 und deaktiviert Debug-Eigenschaft wie in einer anderen Antwort vorgeschlagen (https://gist.github.com/bigT/9d0fd8bba28014d3febf) –

1

Versuchen Sie dann, eine Blank solution zu erstellen. Erstellen Sie Empty project. Habe deine Dateien in entsprechenden Ordnern mit im Lösungsordner. Verwenden Sie im Eigenschaftsfenster Show all files und fügen Sie diese Ordner in das Projekt ein. Es gibt keine bessere Lösung als diese. Ich hoffe.

+0

Danke für die Antwort - ich war mir der leeren Projektvorlage nicht bewusst, aber das Endergebnis ist im Wesentlichen das gleiche wie das, was ich jetzt habe - d. H. Ein leeres C# -Projekt, das vom Build deaktiviert werden muss, um Compilerwarnungen zu verhindern. –

+0

Ich fürchte, ich weiß nicht :(. Wird das zusammen mit dir beobachten :). Aber wenn diese Warnung nur aus diesen xml- oder xslt-Dateien stammt. Sie können versuchen, die Build-Aktion als Ressource festzulegen. Da bauen Sie es nicht in einem dieser Modi. –

9

Andy postete eine link mit einer Lösung, die meistens für mich arbeitete; im Grunde löschen Sie die folgende Zeile aus der Projektdatei:

<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> 

und fügen Sie die folgenden Zeilen:

<Target Name="Build"> 
    <Copy 
    SourceFiles="@(Content)" 
    DestinationFiles="@(Content->'$(OutputPath)%(RelativeDir)%(Filename)%(Extension)')" /> 
</Target> 
<Target Name="Clean"> 
    <Exec Command="rd /s /q $(OutputPath)" Condition="Exists($(OutputPath))" /> 
</Target> 
<Target Name="Rebuild" DependsOnTargets="Clean;Build"> 
</Target> 

Ich fand auch, dass das Projekt Debug-Eigenschaft deaktivieren „Aktivieren Sie den Visual Studio-Hosting-Prozess“ (für jeden Konfiguration) verhindert, dass die Datei MyProject.vshost.exe generiert wird.

Wie David I. McIntosh in a comment on this answer wies darauf hin, wenn Ihr Projekt Teil einer Lösung mit mehreren Projekten und andere Projekte verwenden den gleichen Ausgangspfad wie der Inhalt nur für Projekt, das oben Clean Ziel wird alle Dateien löscht im Ausgabepfad, dh die Build-Ausgabe anderer Projekte, und wäre daher nur korrekt, wenn das Nur-Inhalt-Projekt das erste erstellte Projekt ist (unter denen, die den gleichen Build-Ausgabepfad verwenden).Das Folgende ist ein sicheres und freundlicher Clean Ziel für dieses Szenario:

<Target Name="Clean"> 
    <Delete Files="@(Content->'$(OutputPath)%(RelativeDir)%(Filename)%(E‌​xtension)')"/> 
</Target> 
+0

Um dies mit TFS Build arbeiten, * nicht * entfernen Sie den Import von Microsoft.CSharp.Targets, und ersetzen Sie die drei Instanzen von $ (OutputPath) mit '$ (OutDir)'. Es wird immer noch lokal funktionieren. – JamesQMurphy

+2

Das obige "Clean" -Ziel ist gefährlich. Das ist besser: \t ' \t \t ' –

+0

@ DavidI.McIntosh Was ist gefährlich daran? –

9

Visual Studio 2015 verfügt über eine Art Projekt „Shared Project“ genannt, die im wesentlichen ein Inhalt nur Projekt ohne Ziele. Es ist unter Visual C# aufgeführt, kann aber für beliebige Dateien verwendet werden.

enter image description here

1

Diese Antwort ist nur eine bequeme Konsolidierung der Antworten oben von Chris Fewtrell und Kenny Evitt gegeben, zusammen mit der geringfügigen Änderung in meinen Kommentaren oben, und ein bisschen mehr Detail auf, was die Erklärung des Inhalts Artikel könnte/sollte wie folgt aussehen:

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <PropertyGroup> 
     <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> 
     <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> 
     <ProjectGuid>{541463A7-7CFA-4F62-B839-6367178B16BD}</ProjectGuid> 
    </PropertyGroup> 
    <PropertyGroup Condition="'$(Configuration)|$(Platform)' == '64-bit|AnyCPU'"> 
     <PlatformTarget>x64</PlatformTarget> 
     <OutputPath>..\builds\$(Configuration)\</OutputPath> 
     <IntermediateOutputPath>..\builds\$(Configuration)\Intermediate\YourProjectName\</IntermediateOutputPath> 
    </PropertyGroup> 
    <ItemGroup> 
     <Content Include="fileInProjectFolder.csv" /> 
     <Content Include="SubDir\fileInSubdir.txt" /> 
     <Content Include="..\actualSourceDirectoryOfFile\app.log.basic.config"> 
      <Link>targetSubdirInOutputDir\app.log.basic.config</Link> 
     </Content> 
     <Content Include="..\actualSourceDirectoryOfFile\yetAnotherFile.config"> 
      <Link>yetAnotherFile.config</Link> 
     </Content> 
     ... more files ... 
    </ItemGroup> 
    <Target Name="Build"> 
     <Copy 
      SourceFiles="@(Content)" 
      DestinationFiles="@(Content->'$(OutputPath)%(RelativeDir)%(Filename)%(Extension)')" /> 
    </Target> 
    <Target Name="Clean"> 
     <Delete Files="@(Content->'$(OutputPath)%(RelativeDir)%(Filename)%(E‌​xtension)')"/> 
    </Target> 
    <Target Name="Rebuild" DependsOnTargets="Clean;Build"> 
    </Target> 
</Project> 

Beachten Sie, dass diese immer kopiert alle „Inhalt“ Dateien in das Ausgabeverzeichnis - die Optionen „Wenn Neuere Kopieren“, „immer kopieren“ und „Nicht kopieren“, wie präsentiert in der Visual Studio-GUI (erscheint z. B. als <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> in der .csproj-Datei) werden ignoriert.

Verwandte Themen