Tengo un VS2008 Quiero copiar ciertos archivos de un directorio a mi /bin/carpeta. He configurado los archivos (ubicados en /common/browserhawk/) en "Copiar al directorio de salida". Sin embargo, también copia la estructura de la carpeta: los archivos se copian en/bin/common/browserhawk/
¿Cómo hago para copiar estos archivos solo /bin/? No quiero almacenarlos en la raíz del sitio web para que se copien correctamente.
Pregunta relacionada: Visual Studio agrega .dll y .pdb al proyecto después de compilar
fuente

xcopy /s /d /y "$(ProjectDir)\stuff" "$(TargetDir)\stuff"Como no puedo comentar sobre respuestas anteriores, pondré la solución aquí:
Agregando a lo que @PaulAlexander proporcionó, agregue lo siguiente a su archivo .csproj / .vbproj:
<ItemGroup> <AvailableItemName Include="RootContent"> <Visible>false</Visible> </AvailableItemName> </ItemGroup> <Target Name="AfterBuild"> <Copy DestinationFolder="$(OutputPath)" SourceFiles="@(RootContent)" SkipUnchangedFiles="true" /> </Target>Esto le permite seleccionar "RootContent" como Acción de compilación en la ventana Propiedades, y se puede acceder a todo a través de la GUI. Una explicación más completa: la opción "AvailableItemName" básicamente crea una nueva lista con nombre a la que puede asignar elementos en el proyecto en la propiedad "Acción de compilación" en la ventana Propiedades. A continuación, puede utilizar esta lista recién creada en cualquier destino que desee (por ejemplo, a través de "@ (RootContent)").
fuente
AvailableItemNameser un elemento no válido si edita el archivo del proyecto dentro de VS; simplemente ignore la advertencia, funciona de todos modos.<Target Name="RootOutputCopyTarget" AfterTargets="Build">Si edita el .csproj / .vbproj en un editor de texto, puede controlar dónde se coloca el archivo 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.txtenbin\someContentInOutputDirectory.txt. También puede elegir un subdirectoriobinsi lo desea; simplemente agréguelo al elemento Link.fuente
Creo que el comando XCOPY maneja mejor los directorios y archivos. Por lo tanto,
Lo que permite crear carpetas fuera del directorio de destino.
La carpeta del proyecto / estructura de archivo de:
Se convierte en:
fuente
/Dtambién puede ser útil para evitar sobrescribir posibles cambios.Agregue lo siguiente a su archivo .csproj / .vbproj
<Target Name="AfterBuild"> <Copy DestinationFolder="$(OutputPath)" SourceFiles="@(RootContent)" SkipUnchangedFiles="true" /> </Target>Luego cambie la Acción de compilación de los archivos que desee en la carpeta raíz a RootContent.
fuente
RootContentno aparece en la lista desplegable "Acción de compilación" e ingresarlo manualmente da como resultado un error "El valor de propiedad no es válido" de Visual Studio. ¿Qué me perdí?Lo he usado en VS2010, VS2015, VS2017 y VS2019. Prefiero esta solución porque:
Hacia el comienzo del archivo del proyecto:
<ItemGroup> <AvailableItemName Include="RootContent"> <!-- Add "RootContent" as a choice in the "Build Action" dropdown. --> <Visible>True</Visible> </AvailableItemName> </ItemGroup>Tomado de esta respuesta
Después de la importación de .targets de Microsoft:
<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
fuente
RootContentque implica "codificado" paraCustomContentindicar que se trata de contenido especializado que estamos agregando a este proyecto y que necesitamos copiar de esta manera en particular. Además, necesitabaTargetPath=%(RecursiveDir)%(Filename)%(Extension)recrear la estructura de carpetas de losCustomContentarchivos especificados a la ruta de salida./common/browserhawk/se copiaran/bin/common/browserhawk/como dijo el OP? IIRC, mi intención era/common/browserhawk/a.txtterminar en/bin/a.txtpero permitir la recursividad desde allí hacia abajo, por lo que/common/browserhawk/secret/stuff.pngtermina en/bin/secret/stuff.png.%(RecursiveDirectory). Esto es realmente genial, porque además de seleccionar archivos individuales en el IDE, también puede especificar varios archivos con comodines. Al usar el**comodín, se conservará toda la estructura de la carpeta.Terminé agregando un paso al archivo de compilación nant para copiar después de una compilación exitosa
<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>fuente
Puede crear un archivo por lotes para copiar los archivos y ejecutarlo como un evento posterior a la compilación.
fuente