c++ - seguridad - Copia automática de archivos a la salida durante la construcción de aplicaciones
historial de archivos windows 7 (7)
¿Puede MSBuild hacer algo para ayudar en este caso?
Usando MSVC 2012, esto funcionó para mí:
Se supone que tiene un archivo "Data / ThisIsData.txt" en su Proyecto c ++.
Descargar el proyecto (clic derecho -> Descargar proyecto).
Editar proyecto XML (clic derecho -> Editar .vcxproj)
Ahora verá los proyectos del archivo MSBuild como XML en su editor.
Encuentra "ThisIsData.txt". Debería verse algo así como:
<ItemGroup>
<None Include="Data/ThisIsData.txt" />
...
</ItemGroup>
Ahora agregue otro grupo de elementos como este:
<ItemGroup>
<Content Include="Data/ThisIsData.txt">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
...
</ItemGroup>
Recarga el proyecto y compila.
Su archivo "ThisIsData.txt" debe copiarse a $ (OutDir) / Data / ThisIsData.txt.
¿Por qué duplicar el ItemGroup?
Bueno, si simplemente cambia el None, incluya un contenido incluido, al IDE ya no parece gustarle y no lo mostrará. Entonces, para mantener una opción de edición rápida para mis archivos de datos, decidí conservar las entradas duplicadas.
Hay una propiedad Copiar en el directorio de salida para archivos en proyectos C #. Pero en los proyectos de VC ++ está ausente. Sé que puedo usar Build events en VC ++ y escribir algo así como
xcopy /y /d %(FullPath) $(OutDir)
¿Hay alguna forma de evitar el uso de CMD (y otros métodos de scripting)? ¿Puede msbuild hacer algo para ayudar en este caso?
Depende de qué versión de Visual Studio esté utilizando. El formato del archivo de proyecto de VC ++ en Visual Studio 2008 no es MSBuild, por lo que usar xcopy en PostBuildStep es una buena opción.
El proyecto de VC ++ en Visual Studio 2010 tiene formato MSBuild. Por lo tanto, hay funcionalidad de la tarea de copia de MSBuild.
Debajo hay una muestra:
<Copy
SourceFiles="%(FullPath)"
DestinationFolder="$(OutDir)"
/>
Si el directorio de destino no existe, se crea automáticamente
Una referencia de tarea de copia de MSDN está here
En VS 2015, es posible dar a los proyectos C la funcionalidad que está en C #. (Idea a partir de la respuesta de Jochen). En lugar de agregar otro ItemGroup, modifique el grupo de elementos dado agregando un elemento CopyTo. IE, usando su ejemplo, simplemente mejora la entrada original a:
<ItemGroup>
<None Include="Data/ThisIsData.txt" />
<DeploymentContent>true</DeploymentContent>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
...
</ItemGroup>
No se requiere otro ItemGroup. Al agregar el elemento CopyTo, agrega una propiedad "Incluido en el proyecto".
Puede especificar la copia en el archivo del proyecto como respondió Jeff G en otra pregunta:
En el archivo
*.vcxproj
, cambie:
<Text Include="Filename.txt" />
a:
<Content Include="Filename.txt"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content>
Luego, en el archivo
*.vcxproj.filters
, cambie:
<Text Include="Filename.txt"> <Filter>Resource Files</Filter> </Text>
a:
<Content Include="Filename.txt"> <Filter>Resource Files</Filter> </Content>
donde la etiqueta <Text ...>
es para archivos de texto especificados (será <Image ...>
para archivos de imagen, etc.)
Si se trata de un dll COM, puede agregarlo a la raíz de su proyecto, marcarlo como ''Contenido'' y establecer copiar en el directorio de salida en ''Siempre''. Tenía que hacer esto para ensamblar COM de captura de firma.
Siguiendo la respuesta de henri-socha sobre VS2015 (y probablemente VS2013 y VS2012, o cualquier cosa que utilice proyectos de estilo MSBuild), el tipo de elemento ItemGroup es importante.
Específicamente, los elementos <Text>
no parecen copiarse, mientras que los elementos <Content>
sí lo hacen.
Entonces, para un directorio de proyecto Data que contiene un archivo de texto ThisIsData.txt , esto creará un subdirectorio Data bajo el directorio $(OutDir)
y copiará el archivo ThisIsData.txt del proyecto en él si es más reciente:
<ItemGroup>
<Content Include="Data/ThisIsData.txt">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
Esto no lo hará, aunque es lo que el IDE de Visual Studio insertará si agrega el archivo de texto a su proyecto y establece la propiedad de Content
en True
.
<ItemGroup>
<Text Include="Data/ThisIsData.txt">
<DeploymentContent>true</DeploymentContent>
</Text>
</ItemGroup>
En otras palabras, necesita agregar el archivo a través del IDE para que se dé cuenta de que el archivo está incluido en el proyecto (que agrega la etiqueta <Text>
ItemGroup), y luego abra el proyecto en un editor de texto y agregue la etiqueta <Content>
ItemGroup para que haga lo que quieras.
No estoy seguro de qué hace realmente la etiqueta <DeploymentContent>
. Puede ser un remanente, ya que la única referencia de MSDN que pude encontrar lo considera archivado: https://msdn.microsoft.com/en-us/library/aa712517.aspx
También puede cambiar el Directorio de destino en Configuration Properties
-> General
-> Output directory
al directorio que desea usar.