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
AvailableItemName
ser 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.txt
enbin\someContentInOutputDirectory.txt
. También puede elegir un subdirectoriobin
si 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
/D
tambié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
RootContent
no 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
RootContent
que implica "codificado" paraCustomContent
indicar 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 losCustomContent
archivos 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.txt
terminar en/bin/a.txt
pero permitir la recursividad desde allí hacia abajo, por lo que/common/browserhawk/secret/stuff.png
termina 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