argumentos - ¿Hay alguna manera de incluir automáticamente archivos de contenido en el archivo de proyecto asp.net?
project csproj (8)
Escribí cómo pude obtener el contenido incluido creado con un pequeño script de powershell:
$folders = Get-ChildItem ./ -r -Directory
$filtered = $folders |Select-Object @{Name=''FullName'';Expression={$_.fullname.replace($pwd,'''')}}, @{Name=''FolderDepth'';Expression={($_.fullname.Split(''/').Count) - ($Pwd.Path.split(''/').count)}} | Sort-Object -Descending FullName,folderDepth
$basefolders = $filtered | Where-Object{$_.folderdepth -eq 1}
$basefoldersobj = @()
foreach($basefolder in $basefolders)
{
$basefoldername =$baseFolder.fullname
$filteredbase = $filtered -match "/$basefoldername//" | Sort-Object -Descending FolderDepth | Select-Object -first 1
if($filteredbase -eq $null)
{
$filteredbase = $filtered -match "/$basefoldername" | Sort-Object -Descending FolderDepth | Select-Object -first 1
}
$obj = New-Object psobject
Add-Member -InputObject $obj -MemberType NoteProperty -Name ''Folder'' -Value $basefolder.fullname.trim(''/')
Add-member -InputObject $obj -MemberType NoteProperty -Name ''DeepestPath'' -Value $filteredbase.folderDepth
$basefoldersobj += $obj
}
$include = ''*.*''
foreach($bfolderObj in $basefoldersobj)
{
$includecount = ''''
$includecount = "/$include" * ($bfolderObj.Deepestpath)
Write-Output "<content Include=`"$($bfolderObj.folder)$includecount`" /> "
}
Esto debería producir la instrucción de inclusión necesaria en el mensaje de PowerShell.
A menudo agrego muchos archivos de contenido (principalmente imágenes y js) a mi proyecto ASP.NET. Estoy usando el sistema de publicación VS, y al publicar, los archivos nuevos no se publican hasta que los incluyo en el proyecto. Me gustaría incluir automáticamente todos los archivos en el directorio especificado. ¿Hay alguna forma de especificar qué directorios deberían incluirse automáticamente en el archivo csproj o en otro lugar?
Me di cuenta de que la mejor solución para esto es agregar archivos manualmente, uno por uno. Si tienes cientos de ellos como yo lo hice, fue cuestión de pocas horas. Es curioso que incluso en 2016 con VS 2015 este grave problema aún no se resuelve. Ahh, cómo me encanta Xcode.
No que yo sepa; sin embargo, mi sugerencia es pegarlos en el proyecto, ya que esto los incluirá por defecto. Por lo tanto, en lugar de pegarlos en el directorio a través de Explorer, use Visual Studio para pegar los archivos en las carpetas.
Para aquellos que tienen problemas al usar la respuesta de Chris , esta es la solución para Visual Studio 2012 y posteriores:
<Target Name="ContentsBeforeBuild" AfterTargets="BeforeBuild">
<ItemGroup>
<Content Include="images/**" />
</ItemGroup>
</Target>
Como Chris mencionó en su respuesta, Visual Studio no tocará esta sección <Target>
, incluso si manipula manualmente (agregando / eliminando archivos) con el directorio de destino.
Tenga en cuenta que debe incluir un subdirectorio donde se encuentran los archivos (en el caso anterior, sus images
). Visual Studio / MSBuild colocará esos archivos en el mismo directorio dentro de la estructura del proyecto. Si no utiliza un subdirectorio, los archivos se colocarán en la raíz de la estructura del proyecto.
Para una explicación rápida de los comodines:
-
**
significa todo recursivamente (archivos, subdirectorios y archivos dentro de esos) -
*.ext
incluirá todos los archivos con extensiónext
dentro del directorio de nivel superior, pero no los subdirectorios- Por ejemplo,
*.ext
podría ser*.png
,*.js
, etc. Cualquier extensión de archivo funcionará
- Por ejemplo,
-
**/*.ext
incluirá todos los archivos con extensiónext
del directorio de nivel superior y todos los subdirectorios. - Ver la respuesta de ¿Cómo uso los patrones de nomenclatura Nant / Ant? para una explicación más completa con ejemplos.
Para completarlo, tenga en cuenta que existe una diferencia entre usar <Target>
y no usarlo.
Con el enfoque <Target>
, Visual Studio no mostrará los archivos dentro del Explorador de soluciones.
<Target Name="ContentsBeforeBuild" AfterTargets="BeforeBuild">
<ItemGroup>
<Content Include="images/**" />
</ItemGroup>
</Target>
El enfoque que no es <Target>
instruirá a Visual Studio para que muestre los archivos dentro del Explorador de soluciones. El inconveniente de esto es que cualquier manipulación de los directorios automáticos hará que Visual Studio anule la entrada del comodín. También se debe tener en cuenta que el siguiente enfoque solo actualizará el Explorador de soluciones al abrir la Solución / Proyecto en VS. Incluso el botón de barra de herramientas "actualizar" de Solution Explorer no lo hará.
<ItemGroup>
<Content Include="images/**" />
</ItemGroup>
Puede agregar archivos con enlaces como este, pueden buscarse, visualizarse, pero no se visualizan si intenta cambiarlos, también visual studio deja los comodines en su lugar:
<ItemGroup>
<Content Include="../Database Schema/Views/*.sql">
<Link>Views/*.sql</Link>
</Content>
</ItemGroup>
Esto va dentro del archivo .proj.
Puede usar el método System.IO.Directory.GetFile(string)
framework y sus sobrecargas para incluir recursivamente todos los archivos.
<ItemGroup>
<Content Include="$([System.IO.Directory]::GetFiles(''$(ProjectDir)Scripts/', ''*.js'', SearchOption.AllDirectories))" />
<Content Include="$([System.IO.Directory]::GetFiles(''$(ProjectDir)Images/', ''*.png'', SearchOption.AllDirectories))" />
</ItemGroup>
Simplemente puede ampliar el archivo .csproj de su sitio web. Simplemente agregue su carpeta raíz de contenido con un comodín recursivo:
...
<ItemGroup>
<!-- your normal project content -->
<Content Include="Default.aspx" />
<!-- your static content you like to publish -->
<Content Include="Images/**/*.*" />
</ItemGroup>
...
Hacerlo hace que esta carpeta y todo el contenido a continuación sea visible dentro de su navegador de soluciones.
Si intenta ocultar la carpeta dentro del navegador de soluciones especificando
<Content Include="Images/**.*.*">
<Visible>false</Visible>
</Content>
No será publicada.
Actualizar
Como ya descubrió, el comodín se reemplazará tan pronto como toque la carpeta dentro de su solución porque los proyectos de VS no están diseñados para contener contenido arbitrario.
Por lo tanto, deberá asegurarse de que la carpeta y su contenido nunca se modifiquen desde VS; agregar o eliminar archivos solo se puede hacer en el sistema de archivos ... que es lo que quería, ya que entendí su pregunta.
Sería más fácil si la carpeta pudiera estar oculta en VS, pero no pude encontrar una manera de ocultarla Y publicar.
Otro enfoque fallido fue incluir la carpeta mediante una tarea CreateItem
. Esto dio como resultado que el contenido de la carpeta se publicara en / bin / app.publish / ... y no se pudo convencer de publicarlo junto con los elementos de contenido dentro de .csproj, así que no lo presenté en mi respuesta.
Viejo hilo, lo sé, pero encontré una manera de hacer esto que sigo olvidando, y en mi búsqueda para encontrarlo por última vez, me encontré con esta pregunta. La mejor forma que he encontrado de esto es usar el objetivo BeforeBuild en el archivo .csproj.
<Target Name="BeforeBuild">
<ItemGroup>
<Content Include="**/*.less" />
</ItemGroup>
</Target>
VS 2010 no tocará esta sección y garantiza que sus archivos se incluyan como contenido cada vez que se construya el proyecto.