2010-08-23 12 views
14

Tengo un montón de archivos auxiliares XML y XSLT que quiero editar y administrar en Visual Studio.Existe algo así como un "proyecto de solo contenido/datos" en visual studio

Los archivos no pertenecen lógicamente a ningún proyecto de código en mi solución y para agruparlos cuidadosamente, he creado un proyecto dummy C# dll en Visual Studio y lo inhabilité para compilar en Debug/versiones liberadas) .

Me preguntaba si había una manera más agradable de lograr el mismo resultado (es decir, tener todos los archivos visibles en el explorador de soluciones). Lo que realmente quiero es un tipo de proyecto de estudio visual de "solo contenido", pero tal cosa no existe (¿o no lo he buscado lo suficiente?).

He jugado con la idea de agregar los archivos como elementos de solución, pero luego parecen más difíciles de administrar porque la creación de una nueva "carpeta de elementos de solución" no crea realmente una carpeta en el disco.

¿Alguien tiene alguna idea?

Respuesta

12

Un colega de trabajo ha encontrado una solución.

Ha sugerido la edición manual del proyecto para eliminar el DefaultTargets del Proyecto (y eliminar una carga de propiedades ahora no utilizadas).

MSBuild se queja si no hay objetivos en el proyecto, por lo que ha agregado tres objetivos vacíos.

El proyecto final es como la siguiente

<?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> 

Es cierto que esta solución requiere más tocar el violín que me hubiera gustado, pero parece lograr lo que buscaba: a saber, un proyecto que no aattempt para producir cualquier acumulación salida.

+0

Es bueno saberlo;) –

+2

Actualizado para VS2013 y propiedad de depuración desactivada como se sugiere en otra respuesta (https://gist.github.com/bigT/9d0fd8bba28014d3febf) –

1

A continuación, intente crear un Blank solution. Crear Empty project. Tenga sus archivos en las carpetas respectivas con en la carpeta de la solución. Desde la ventana de propiedades, use Show all files, incluya esas carpetas en el proyecto. No hay mejor solución que esto. Espero.

+0

Gracias por la respuesta: desconocía la plantilla de proyecto en blanco, pero el resultado final es esencialmente el mismo que tengo ahora, es decir, un proyecto de C# vacío que debe deshabilitarse de la compilación para evitar advertencias del compilador. –

+0

Me temo que no sé :(. Seguiré viendo esto junto con usted :). Pero, si esas advertencias son solo de esos archivos xml o xslt. Puede intentar establecer la acción de compilación como Recurso. Desde entonces, no lo estás construyendo en ninguno de esos modos. –

9

Andy publicó un link con una solución que en su mayoría me ha funcionado; básicamente eliminar la siguiente línea del archivo de proyecto:

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

y añadir las siguientes líneas:

<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> 

También encontraron que la desactivación de la propiedad del proyecto de depuración "Activar el proceso de alojamiento de Visual Studio" (para cada configuración) impidió que se generara el archivo MyProject.vshost.exe.

Como David I. McIntosh señaló en a comment on this answer, si su proyecto es parte de una solución con múltiples proyectos y cualquier otro proyecto utilizan la misma ruta de salida como el proyecto de contenido de solo, el Clean objetivo anterior, se eliminarán todos los archivos en la ruta de salida, es decir, el resultado de compilación de otros proyectos, y por lo tanto solo sería correcto si el proyecto de solo contenido es el primer proyecto creado (entre los que comparten la misma ruta de salida de compilación).La siguiente es una Clean destino más seguro y más amigable para este escenario:

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

Para que esto funcione con TFS Build, no * * elimine la importación de Microsoft.CSharp.Targets, y reemplace las tres instancias de '$ (OutputPath)' con '$ (OutDir)'. Todavía funcionará localmente también. – JamesQMurphy

+2

El objetivo "Limpiar" anterior es peligroso. esto es mejor: \t ' \t \t ' –

+0

@ DavidI.McIntosh ¿Qué tiene de peligroso? –

9

Visual Studio 2015 tiene un tipo de proyecto llamado "Proyecto compartido", que es esencialmente un único proyecto contenido sin objetivos. Se enumera bajo Visual C# pero se puede usar para cualquier archivo.

enter image description here

1

Esta respuesta es simplemente una consolidación conveniente de las respuestas anteriores dada por Chris Fewtrell y Kenny Evitt, junto con la ligera modificación en mis comentarios anteriores, y un poco más de detalle en lo que la declaración del contenido artículos deberían/​​podrían ser:

<?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> 

Nota que esto siempre copia todos los archivos de "contenido" en el directorio de salida - las opciones "Copiar si es más nuevo", "Copiar siempre" y "no se copian", como se presentado en la GUI del estudio visual (aparece como, por ejemplo, <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> en el archivo .csproj) son ignorados

Cuestiones relacionadas