2010-03-31 9 views
66

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?¿Hay alguna manera de incluir automáticamente archivos de contenido en el archivo de proyecto asp.net?

+0

ver: esto puede ayudarle a http://stackoverflow.com/questions/1743432/how-can-i-automatically-add-existing-items-to-a-visual-studio-project/1756240 – Saar

+1

no es exactamente lo que estoy buscando – Marko

+0

Actualicé mi respuesta sobre su problema al modificar la carpeta dentro de su buscador de soluciones vs. – Filburt

Respuesta

109

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 va a tocar esta sección, y se asegura de que los archivos se incluyen como contenido cada vez que se genere el proyecto.

+0

¿Cuál es el significado de .less? ¿Y qué significa toda la cadena '** \ *. Less'? –

+3

. Los archivos .less son archivos CSS destinados a ser analizados por el preprocesador Menos CSS. Google "punto menos" para más información sobre eso. La expresión '** \ *. Less' significa que incluye todos los archivos * .less en todos los directorios. En MSBUILD hablar, ** significa 'todos los directorios recursivamente' – Chris

+0

¿Esto agregará los elementos al Explorador de soluciones en Visual Studio (específicamente 2012)? – jacobappleton

1

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.

44

Simplemente puede ampliar el archivo .csproj de su sitio web. Sólo tiene que añadir su carpeta raíz de contenido con un comodín recursiva:

... 
<ItemGroup> 
    <!-- your normal project content --> 
    <Content Include="Default.aspx" /> 

    <!-- your static content you like to publish --> 
    <Content Include="Images\**\*.*" /> 
</ItemGroup> 
... 

Si lo hace, hace que esta carpeta y todo su contenido a continuación visible dentro de su navegador solución.

Si intenta ocultar la carpeta dentro del navegador solución especificando

<Content Include="Images\**.*.*"> 
    <Visible>false</Visible> 
</Content> 

no será publicada.


actualización

Como ya descubrió el comodín será reemplazado tan pronto como se toca 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 publicarla.

Otro enfoque fallido fue incluir la carpeta en una tarea CreateItem. Esto dio como resultado que el contenido de la carpeta se publicó 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.

+3

Funciona hasta que agregue o elimine el archivo manualmente. Después de esa línea Desaparece del archivo del proyecto. – Marko

+2

@Marko es correcto. Después de agregar '' Funcionó. Una vez que agregue más imágenes, se cambiará .csproj y se volverá a enumerar todos los archivos en las imágenes/... y desaparecerá . –

+0

Pegue este código en un archivo .proj por separado y llámelo desde el destino de compilación anterior en el archivo .csproj. –

2

Puede añadir archivos con enlaces de este tipo, que se pueden buscar, vista-poder, pero no la salida si intenta cambiarlas, también deja el estudio visual de los comodines en su lugar:

<ItemGroup> 
    <Content Include="..\Database Schema\Views\*.sql"> 
     <Link>Views\*.sql</Link> 
    </Content> 
    </ItemGroup> 

Este entra dentro del archivo .proj

+1

Intenté esto y VS reemplaza el comodín con los archivos individuales cuando agrego o elimino un archivo usando VS. –

+0

Esto es muy elegante, pero debe eliminar el comodín del enlace objetivo – SimSimY

6

Puede utilizar el método System.IO.Directory.GetFile(string) de la infraestructura 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> 
+0

Esto fue de gran ayuda para mí; Tengo varios directorios con algunos niveles de profundidad y muchos archivos que quería incluir automáticamente y esto convirtió todos esos contenidos en uno. ¡Gracias! –

+0

He experimentado con esto un poco más y resulta que tiene todas las mismas limitaciones que 'Include =" ** \ *. Ext "' con comodines. –

3

he escrito hasta la forma en que era capaz de conseguir el contenido incluye creada 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 necesaria instrucción de inclusión en el powershell pronta

0

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.

1

Para aquellos que tienen problemas para usar Chris' answer, 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 voluntad no toque esta sección <Target>, incluso si violín de forma manual (agregar/eliminar archivos) con el directorio de destino.

Tenga en cuenta que debe incluir un subdirectorio donde se encuentran los archivos (en el caso anterior, es 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 de forma recursiva (archivos, subdirectorios y archivos dentro de los)
  • *.ext incluirá todos los archivos con la extensión ext dentro del más alto nivel directorios, subdirectorios, pero no
    • Por ejemplo, podría ser *.ext*.png, *.js, etc. Cualquier extensión archivo funcionará
  • **\*.ext incluirá todos los archivos con la extensión ext desde el directorio de nivel superior y todos los subdirectorios.
  • Consulte la respuesta en How do I use Nant/Ant naming patterns? para obtener una explicación más completa con ejemplos.

Para finalizar, tenga en cuenta que hay una diferencia entre el uso de <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 <Target> enfoque no se instruir a Visual Studio para muestran 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 será solo actualice Solution Explorer 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> 
Cuestiones relacionadas