Tengo un VS2008 quiero copiar ciertos archivos de un directorio en mi /bin/ carpeta. He puesto los archivos (que se encuentra en /common/browserhawk/) a «Copiar en el Directorio de Salida». Sin embargo, se copia a la carpeta de la estructura así: los archivos se copian a /bin/common/browserhawk/

¿Cómo puedo obtener estos archivos para copiar sólo /bin/? No quiero almacenar estos en la raíz del sitio web para llegar a copiar correctamente.

Relacionadas Con La Pregunta: Visual Studio agrega .dll y .pdb para el proyecto después de la recopilación de

InformationsquelleAutor Steve Wright | 2009-06-18

8 Comentarios

  1. 59

    Puede agregar un Post Generar Evento para copiar los archivos.

    Ir a propiedades del proyecto, pestaña Eventos de Compilación y agregar lo siguiente en el evento Posterior a la generación de la línea de comandos:

    copy "$(ProjectDir)\common\browserhawk\*.*" "$(TargetDir)"

    Asegúrese de incluir las comillas si el proyecto de la ruta contiene espacios.

    • Gracias por los consejos, ya que ha trabajado para mí en VS2012 así.
    • He modificado este ligeramente en mi caso: xcopy /s /d /y "$(ProjectDir)\stuff" "$(TargetDir)\stuff"
  2. 44

    Ya que no puedo comentar sobre las anteriores respuestas, voy a poner aquí la solución:

    Añadir a lo que @PaulAlexander siempre, añada lo siguiente a su .csproj/.vbproj de archivo:

    <ItemGroup>
        <AvailableItemName Include="RootContent">
          <Visible>false</Visible>
        </AvailableItemName>  
    </ItemGroup>
    <Target Name="AfterBuild">
        <Copy
            DestinationFolder="$(OutputPath)"
            SourceFiles="@(RootContent)"
            SkipUnchangedFiles="true"
            />  
    </Target>

    Esto permite que usted seleccione el «RootContent» como la Acción de generación de la ventana de Propiedades, y todas se puede acceder a través de la interfaz gráfica de usuario.
    Una explicación más completa: el «AvailableItemName» opción básicamente crea un nuevo nombre de la lista que usted puede asignar a los elementos del proyecto en virtud de la propiedad «Build Action» en la ventana de Propiedades. Puede utilizar esta lista recién creada en cualquier Objetivo que te gusta (por ejemplo a través de «@(RootContent)»).

    • Bonita respuesta, sólo se utiliza este mismo éxito!
    • También tenga en cuenta que VS 2010 (no estoy seguro acerca de las versiones anteriores) se quejan de AvailableItemName ser un elemento no válido si se edita el archivo de proyecto en VS; simplemente ignorar la advertencia, funciona de todos modos.
    • Desafortunadamente esto solo copias el archivo en el directorio de salida del proyecto pertenece el archivo – y no en el directorio de salida de la puesta en marcha del proyecto. Esto es importante cuando se utiliza este en un proyecto de biblioteca.
    • eso significa que usted no tiene los directorios de salida para sus proyectos a punto para el mismo directorio.
    • Correcto, si no esta el problema desaparece. Desafortunadamente, esto no siempre es fácilmente posible (cuando se trabaja con proyectos de otras personas).
    • Esto funciona muy bien para la construcción de la liberación y el modo de depuración con vs2008 pero no parece funcionar cuando se utiliza un solo clic de publicación. Alguna sugerencia?
    • Pero no copia RootContent archivos de mi carpeta de salida del proyecto. He probado con VS2008 y VS2010. Alguna sugerencia? Cualquiera puede publicar un proyecto de ejemplo?
    • No estoy seguro si esto no es relevante ya o qué pasó, pero no funciona. Probado con Copy to output directory conjunto para ambos Copy if newer y Do not copy. Se copia la estructura de directorios con Copy if newer y no hacer nada con Do not copy
    • No funcionó para mí en vs2015. Fijado por la reescritura de destino un poco: <Target Name="RootOutputCopyTarget" AfterTargets="Build"> … </Target>

  3. 43

    Si edita el .csproj /.vbproj en un editor de texto, usted puede controlar donde el archivo se coloca en el directorio de salida, y también qué nombre tendrá el archivo en el directorio de salida. Por ejemplo:

    <None Include="content\someContent.txt">
      <Link>someContentInOutputDirectory.txt</Link>
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>

    Esto pondrá el archivo content\someContent.txt en bin\someContentInOutputDirectory.txt. También puede elegir un subdirectorio en bin si usted desea; sólo tiene que añadir el elemento de Enlace.

    • Wow, era yo la suerte de necesidad de esto ahora y no hace dos días. Gracias; esto es genial!
    • Yo no creo que eso es lo que el ‘Link’ propiedad. Creo que es utilizado para incluir archivos de archivos externos en el proyecto sin necesidad de copiarlos en tu proyecto ?
    • Muchas veces, los nombres de las cosas en MSBuild no se corresponden en modo alguno a su nombre en Visual Studio. Encontré que la solución buscando en los importados .los objetivos de los archivos y utilización de ILSpy en la tarea de MSBuild asambleas. La particular tarea que consume el Enlace de metadatos se llama AssignTargetPath, que es parte de la AssignTargetPaths de destino de Microsoft.Común.CurrentVersion.objetivos archivo. Si recuerdo correctamente, el TargetPath metadatos es utilizada por el _CopyOutOfDateSourceItemsToOutputdirectory de destino en el mismo archivo. Usted puede rastrear el resto.
    • Habiendo dicho todo en el otro comentario, usted está probablemente en lo correcto de que esta característica se utiliza para hacer que los archivos vinculados de trabajo. Pero también puede ser utilizado para otros fines.
    • Oh mi dios, gracias. Acabo de pasar 6 horas tratando de arreglar algún rincón caso de la basura donde VS no era la copia .dll de una manera inteligente. Esta es la verdadera respuesta a la vida, el universo y todo.
    • Este es por lejos la mejor solución
    • Esto debe ser establecido como la respuesta correcta
    • Esto no parece para trabajar con los archivos existentes añadido «enlace». El <Link> tags parecen describir el lugar donde el archivo vinculado se encuentra dentro del proyecto, que es, obviamente, derrotando el propósito. Podría esta respuesta ampliarse para incluir esto?
    • El Incluir el atributo se refiere a la fuente del archivo, y la etiqueta de Enlace se refiere a la salida deseada ruta de acceso y nombre de archivo. No tengo una copia de VS2008 a la mano, pero yo sólo lo intentó en VS2013 y funcionó bien (y yo había probado la original respuesta en VS2008). He añadido un vinculados, archivo externo, me puse a «copiar si es posterior», me editar manualmente el Enlace de la etiqueta para cambiar el directorio de salida, y pareció funcionar bien. Lo que no está trabajando para usted?
    • stackoverflow.com/questions/30864223/…
    • He encontrado una vez que yo había hecho esto y se vuelve a cargar el proyecto en visual studio los archivos de dependencia desaparecido desde el explorador de soluciones como si no se incluye en el proyecto. Sin embargo todavía se construye como se esperaba, y no copiar a la salida deseada. A medida que trabaja actualmente estoy agregando cada archivo dos veces, una vez con ninguna acción, y una vez con la ‘copia a la salida del conjunto.
    • Los archivos deben estar todavía en el explorador de soluciones. Una limitación es que su ubicación en el explorador de soluciones reflejará su Enlace metadatos… un archivo que se debe copiar a foo/bar.txt aparecerá en el explorador de soluciones dentro de los foo carpeta no existe. Al menos, eso es lo que trabajó en VS2013.
    • Esta no es la intención de uso de esta etiqueta. En VS2013, esto arroja una advertencia cuando se carga el proyecto, y el archivo no es visible como añadido para el proyecto, ya que es el directorio del proyecto.
    • A mi me funciona, pero me sale feo advertencias en Visual Studio. Específicamente: The file 'XXX' could not be added to the project. Cannot add a link to the file XXX. This file is within the project directory tree. Nadie gestionar para suprimir esto?

  4. 15

    Creo que el comando XCOPY maneja los directorios y archivos mejor. Por lo tanto,

        XCOPY "$(ProjectDir)common/browserhawk" "$(TargetDir)" /E /I /F /Y

    Que permite la creación de carpetas fuera del directorio de destino.

        XCOPY "$(ProjectDir)Templates" "$(TargetDir)" /E /I /F /Y

    El Proyecto de estructura de carpeta/archivo:

        A:\TEMP\CONSOLEAPPLICATION3\TEMPLATES
        ├───NewFolder1
        ├───NewFolder2
        │       TextFile1.txt
        │       TextFile2.txt
        └───NewFolder3
                TextFile1.txt
                TextFile2.txt
                TextFile3.txt

    Se convierte en:

        A:\TEMP\CONSOLEAPPLICATION3\BIN\DEBUG
        │   ConsoleApplication3.exe
        │   ConsoleApplication3.pdb
        │   ConsoleApplication3.vshost.exe
        │   ConsoleApplication3.vshost.exe.manifest
        ├───NewFolder1
        ├───NewFolder2
        │       TextFile1.txt
        │       TextFile2.txt
        │
        └───NewFolder3
                TextFile1.txt
                TextFile2.txt
                TextFile3.txt
    • Solución más fácil. Y funciona para VS Expreso! gracias.
    • /D puede ser útil también, para evitar sobrescribir los posibles cambios.
  5. 10

    Agregar lo siguiente a tu .csproj/.archivo vbproj

    <Target Name="AfterBuild">
        <Copy
            DestinationFolder="$(OutputPath)"
            SourceFiles="@(RootContent)"
            SkipUnchangedFiles="true"
            />  
    </Target>

    A continuación, cambiar la Acción de generación de los archivos que desee en la carpeta raíz para RootContent.

    • Genial!!! Puede acceder a este a través de el VS 2008 diálogos?
    • No a través de los diálogos…pero usted puede editar su proyecto en VS. Haga clic derecho en el proyecto y seleccione Descargar Proyecto. Luego haga clic derecho y seleccione Editar. A continuación, puede editar el MSBuild archivo que es su proyecto.
    • Gracias, esta parece útil. Unfortuntely, incluso después de añadir el fragmento de el .archivo vbproj, RootContent no se presenta en el «Build Action» de la lista desplegable e introducir manualmente los resultados en un «valor de la Propiedad no es válido» error de Visual Studio. ¿Qué se me olvida?
    • No trabajar con Visual Studio 2010 C# proyecto de Aplicación de Consola.
    • No trabajar con Visual Studio 2010 VB.NET proyecto de Aplicación de Consola.
    • No trabajar con Visual Studio 2008 C# proyecto de Aplicación de Consola.
    • El Elemento real que la lista podría ser llamado algo diferente. Puede establecer la configuración de generación de proyecto de Diagnóstico y, a continuación, construir el proyecto. En la ventana de salida, verás una larga lista de bienes/valores de elemento de que MSBuild utilizado para construir el proyecto. Compruebe el valor de la propiedad que mejor se adapte.
    • Si vas a hacer eso, usted debe actualizar también FileWrites. De lo contrario, Limpio en realidad no va a limpiar esos archivos. Ver el CopyFilesToOutputDirectory integrado de destino.
    • Editar el archivo de proyecto de forma manual para definir el tipo de elemento «RootContent», después de que se mostrará en la lista desplegable y funciona correctamente.

  6. 5

    He usado esto en VS2010 y VS2015. Yo prefiero esta solución porque:

    1. El XML es reutilizable en cualquier proyecto
    2. La «RootContent» es elegida como una Acción de generación de la interfaz de usuario de Visual Studio, como cualquier otra «Contenido»
    3. La «CopyToOutputDirectory» es obedecido, tal como era de esperar
    4. La RootContent se agrega a la salida del proyecto: se va a llevar a través de Referencias de Proyecto, obedece a «Limpio», etc.
    5. La RootContent puede ser especificado con un comodín, la preservación de la estructura de carpetas recursiva:
      <RootContent Include="common\browserhawk\**">
        <CopyToOutputDirectory>Always</CopyToOutputDirectory>
      </RootContent>

    Hacia el principio del archivo de proyecto:

      <ItemGroup>
        <AvailableItemName Include="RootContent">
          <!-- Add "RootContent" as a choice in the "Build Action" dropdown. -->
          <Visible>False</Visible>
        </AvailableItemName>
      </ItemGroup>

    Tomado De Esta Respuesta

    Después de la de Microsoft .los objetivos de Importación:

      <PropertyGroup>
        <AssignTargetPathsDependsOn>
          $(AssignTargetPathsDependsOn);
          IncludeRootContentAsContent;
        </AssignTargetPathsDependsOn>
      </PropertyGroup>
      <Target Name="IncludeRootContentAsContent">
        <CreateItem Include="@(RootContent)" AdditionalMetadata="TargetPath=%(RecursiveDir)%(Filename)%(Extension)">
          <Output ItemName="ContentWithTargetPath" TaskParameter="Include" />
        </CreateItem>
      </Target>

    Tomado De Esta Respuesta

    • Esto es bueno – me gustaría intercambiar RootContent que implica «codificados» para CustomContent para indicar que éste es de contenido especializado estamos añadiendo a este proyecto y necesitamos copia de esta manera en particular. También como un aparte, necesitaba TargetPath=%(RecursiveDir)%(Filename)%(Extension) para recrear la estructura de carpetas de la especificada CustomContent archivos a la ruta de salida.
    • El objetivo es copiar el archivo(s) directamente a la raíz del directorio de salida, independientemente de RecursiveDirectory. El built-in «Contenido» Build Action ya que nos proporciona un mecanismo para copiar mientras que el mantenimiento de la RecursiveDirectory.
    • No he tenido la oportunidad de probar esto en un rato, pero no «configuración de Contenido» build action provocar que los archivos bajo /common/browserhawk/ para ser copiado a /bin/common/browserhawk/ como el OP dijo? Si mal no recuerdo, mi intención era tener /common/browserhawk/a.txt terminan en /bin/a.txt pero permitir la recursividad de ahí abajo, así que /common/browserhawk/secret/stuff.png termina en /bin/secret/stuff.png.
    • Ok, sí, que hace total sentido ahora. He actualizado la respuesta a incluir la %(RecursiveDirectory). Esto es realmente genial, porque además de seleccionar archivos individuales en el IDE, también puede especificar varios archivos con caracteres comodín. Cuando se utiliza el ** comodín, toda la estructura de carpetas serán preservados.
    • Impresionante – gracias por venir de nuevo a este.
    • Muchas gracias por la gran respuesta! Creo que esta respuesta es la respuesta correcta porque de lo siguiente: 1. No externo cmds 2. la plataforma de la cruz

  7. 2

    Terminé de agregar un paso a la nant construir archivo de copia después de la exitosa compliation

    <target name="action.copy.browserhawk.config" depends="compile.source">
        <copy todir="${App.Web.dir}/bin/" includeemptydirs="false">
            <fileset basedir="${browserhawk.config.dir}">
                <include name="bhawk_bb.dat" />
                <include name="bhawk_sp.dat" />
                <include name="browserhawk.properties" />
                <include name="maindefs.bdd" />
                <include name="maindefs.bdf" />
                <include name="BH_PRO.lic" />
            </fileset>
        </copy>
        <echo message="COPY BROWSERHAWK CONFIG: SUCCESS   ${datetime::now()}" />
    </target>
    • -1; Porque la respuesta se basa en NAnt.
    • ¿qué es un nant?
    • +1 porque alguien mediante nant, esta es una respuesta útil
  8. 1

    Se podría construir un archivo de proceso por lotes para copiar los archivos y ejecutar como un evento posterior a la compilación.

    • Terminé haciendo esto para uno de mis proyectos (a pesar de que utiliza una secuencia de comandos de Python en lugar de un murciélago).

Dejar respuesta

Please enter your comment!
Please enter your name here