Typescript: Opción "No compilar" de Visual Studio

Creado en 11 mar. 2015  ·  29Comentarios  ·  Fuente: microsoft/TypeScript

Hola,

Recientemente, hemos desarrollado una mejora para el complemento grunt-ts que permite apuntar a un archivo de proyecto de Visual Studio para las rutas de archivo de entrada de TS y la información de configuración de TS en lugar de tener que usar src: y las otras opciones. https://github.com/TypeStrong/grunt-ts/pull/215

Grunt-ts junto con Task Runner Explorer permite a los desarrolladores usar características que aún no son compatibles con la interfaz de usuario de configuración de compilación del proyecto de Visual Studio TypeScript (como preserveConstEnums).

Una cosa sobre el uso de Task Runner Explorer es que solo puede conectarse a ciertos eventos de Visual Studio. Entre ellos se encuentra "después de la construcción" y "antes de la construcción". Después de la compilación funciona muy bien, pero tiene el problema extraño de VS haciendo su propio paso de compilación de TypeScript seguido de grunt-ts llamando a tsc. Esto no parece ser un problema excepto por el rendimiento (el trabajo que VS está haciendo para compilar y emitir es un esfuerzo inútil y el desarrollador tiene que esperar más tiempo para obtener el resultado deseado).

Me pregunto cuál sería la mejor manera de apagar _sólo_ la compilación / emisión en Visual Studio para TypeScript, pero mantener todo lo demás igual (servicio de lenguaje / resaltado de sintaxis, lista de errores, creación de C # o VB, etc.). ¿Es esto incluso posible actualmente? Si no es así, ¿podría serlo?

¡Gracias!

Question

Comentario más útil

Solo para su información, en VS2015 RTM hay una forma más fácil de deshabilitar TypeScriptCompile:
Simplemente agregue <TypeScriptCompileBlocked>true</TypeScriptCompileBlocked> al .csproj , por ejemplo, en el primer <PropertyGroup> .

Todos 29 comentarios

Hola, hace unos días envié el número 2252 que está relacionado de alguna manera con esto. Necesito alguna forma de activar eventos previos y posteriores a la compilación cuando uso la compilación al guardar para un proyecto de TS que tiene una única salida de archivo (sin dejar de mantener los comandos habituales de VS "Build" y "Rebuild", servicio de idioma, depuración, etc. .). Como solución alternativa, actualmente estoy usando Task Runner Explorer con grunt-contrib-watch (iniciado usando un enlace de "Solución abierta") para observar el archivo compilado en busca de cambios y realizar acciones adicionales cada vez que se modifica.

Sin embargo, no lo encuentro realmente satisfactorio (también necesito realizar algunas acciones de compilación previa y, en general, prefiero que los pasos de compilación se realicen usando Grunt o todos con VS) y considero hacer exactamente lo que se describe: Apague la compilación VS completamente e implementar una compilación personalizada al guardar, compilaciones completas (que incluyen pruebas unitarias en ejecución, etc.), eventos previos y posteriores a la compilación con una combinación de grunt-contrib-watch, grunt-ts, complementos adicionales de grunt y Task Runner Explorer .

(actualización: ya se implementó y funciona bien; ejecuta un script de compilación gruñido personalizado cada vez que se modifica un archivo .ts, aunque actualmente no es compatible con los enlaces TRE "Before Build" y "After Build", para lo mencionado anteriormente razones).

Parece que la forma más fácil (y menos complicada para los desarrolladores de complementos de TS) de permitir de manera eficiente este tipo de escenarios de compilación sería proporcionar una opción para desactivar cualquier forma de compilación iniciada por Visual Studio. Yo también agradecería alguna idea sobre cómo hacer eso.

No sé si hay una gran opción para ti en este momento. Si configura cada archivo .ts en el proyecto para que tenga Build Action: None en sus propiedades, eso probablemente haría lo que desea, pero es bastante oneroso hacerlo manualmente incluso en proyectos de tamaño mediano.

La compilación se deriva por destinos en proyectos de MSBuild. Si desea deshabilitar la compilación de mecanografiado predeterminada, elimine la referencia a los objetivos de mecanografiado de su archivo.

Esto hará que su servicio de idiomas no recopile todos los archivos del proyecto en un contexto. Yo diría que está bien, y para la próxima versión deberíamos tener soporte para tsconfig y luego ese se convertirá en su nuevo proyecto. Si aún desea que funcione sin usar tsconfig y / o esperando la próxima versión, defina una propiedad <TypeScriptEnabled>true</TypeScriptEnabled> en su archivo de proyecto.

@mhegazy, ¿quisiste decir <TypeScriptEnabled>false</TypeScriptEnabled> ?

bueno dependiendo de lo que quieras :)

si desea desactivar la carga de contenido del proyecto de servicio de idiomas, hágalo falso,
si desea habilitarlo, hágalo realidad. ya está habilitado al incluir los destinos predeterminados (Microsoft.TypeScript.targets)

OK, voy a jugar con eso. ¡Gracias!

Gracias @mhegazy , ¡la opción de configuración parece funcionar hasta ahora! (mientras todavía muestra errores de sintaxis / complie y permite la depuración en IE) e incluso se puede configurar para una configuración de solución específica (lo intenté y pareció funcionar), así:

<PropertyGroup Condition="'$(Configuration)' == 'Debug'">
...
    <TypeScriptEnabled>false</TypeScriptEnabled>
...
</PropertyGroup>

Sin embargo, no estoy exactamente seguro de qué significa "deshabilitar la carga de contenido del proyecto de servicio de idiomas". (No estoy muy familiarizado con los conceptos de VS como objetivos, contextos, etc.). Por lo que he probado, todo parece funcionar normalmente con esta opción (aparte del comportamiento esperado de no compilar en la compilación). Y parece que aún agregará entradas <TypeScriptCompile Include=".."/> para los archivos .ts recién agregados / creados en la configuración del proyecto.

En una nota al margen, ahora con todo hecho a través de Grunt, de alguna manera tengo que encontrar una manera de lidiar con las colisiones entre las compilaciones activadas por grunt-watch y los eventos vinculados "Before Build" / "After Build" al invocar el VS Build (F6) y Rebuild comandos, ya que VS guarda automáticamente antes de que comience la compilación, lo que lleva a dos instancias diferentes de Grunt que se ejecutan innecesariamente en paralelo.

No pude hacer que <TypeScriptEnabled>false</TypeScriptEnabled> funcionara (VS 2013 Update 4 con TypeScript 1.4), pero la eliminación del archivo de objetivos de TypeScript del proyecto deshabilitó la compilación en el proyecto Build.

Estos son los pasos completos requeridos para deshabilitar la compilación de TypeScript en VS (aunque aún tenga los servicios de lenguaje funcionando, siga refactorizando feliz, etc.):

  • Elimine la referencia al archivo ".targets" de TypeScript del archivo del proyecto.
  • Deshabilite "Compilar automáticamente archivos de TypeScript que no formen parte de un proyecto" en las opciones de TypeScript de Visual Studio.

El segundo paso es una especie de error (o al menos el diálogo no está etiquetado de una manera estrictamente precisa); Aunque sus archivos TypeScript son "parte" de un proyecto, si deshabilita el archivo de destino, Visual Studio 2013 los tratará como si no fueran parte de un proyecto y se compilarán al guardar (si la opción global no está configurada). No pude conseguir que <TypeScriptEnabled/> hiciera nada.

Gracias @mhegazy . Sería increíble si esto pudiera ser parte del cuadro de diálogo de opciones de TypeScript, pero al menos es bastante fácil de soportar mediante la edición del proyecto.

una cosa complicada es que <TypeScriptEnabled>false</TypeScriptEnabled> debe estar al final de su archivo específicamente después de la importación a los destinos. como los objetivos lo definen de todos modos, y desea anularlo.

una cosa complicada, esfalso debe estar al final de su archivo específicamente después de la importación a los destinos. como los objetivos lo definen de todos modos, y desea anularlo.

¡Tienes toda la razón! Este fue el truco.

Creo que esto resuelve el problema. Gracias, @mhegazy .

Hola @mhegazy , siento molestarlo. ¿Está seguro de que <TypeScriptEnabled>false</TypeScriptEnabled> funciona en VS 2013 con TypeScript 1.4 instalado? Acabo de actualizar mi PC actual de VS 2013 con TS 1.3 (directamente VS 2013 Update 4) a VS 2013 con TS 1.4, y ahora Visual Studio está tratando de construir TypeScript nuevamente "en la compilación" (lo que significa que los errores que aparecen tienen "Build : "delante de ellos), aunque las últimas cinco líneas de mis proyectos son las siguientes:

  <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TypeScript\Microsoft.TypeScript.targets" Condition="Exists('$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TypeScript\Microsoft.TypeScript.targets')" />
  <PropertyGroup>
    <TypeScriptEnabled>false</TypeScriptEnabled>
  </PropertyGroup>
</Project>

Hoy estaba funcionando correctamente en esta máquina (cuando cerré este ticket), pero ahora que puse 1.4 aquí, la compilación de VS me está dando errores. Comentar la referencia al archivo de destino (y desactivar "compilar al guardar" para TypeScript no en un proyecto) aún lo deshabilita.

Tengo 1.4 en casa y no pude hacer que <TypeScriptEnabled>false</TypeScriptEnabled> funcione en absoluto allí.Me pregunto si hubo una regresión en esta opción de compilación.

<TypeScriptEnabled>false</TypeScriptEnabled> no tiene nada que ver con la construcción. se trata de que Language Service trate sus archivos como parte de un proyecto o no.

si no desea construir en F5, elimine la referencia a los objetivos.

Esa fue la respuesta corta, aquí está la versión larga:

El archivo de proyecto se usa para dos cosas:

  1. build, este es su soporte normal de MSBuild, donde los objetivos llaman a las tareas y el sistema busca entradas, objetivos coincidentes y los ejecuta en orden. así que todo lo que hace es agregar todos los elementos de TypeScriptCompile en el proyecto, pasarlos a tsc.exe junto con algunas opciones.
    Además, las páginas de propiedades del proyecto se derivan de su archivo de proyecto y son solo una interfaz de usuario sobre las propiedades de MSBuild.
  2. servicio de idioma, esto es su finalización, ayuda de firma, errores en VS, compilar al guardar ... etc. queremos que funcionen de la misma manera que su compilación normal, por lo que buscamos las mismas propiedades que define para compilación Comportamiento de LS. por ejemplo, si su destino está configurado en ES3 en su archivo de proyecto ( <TypeScriptTarget>ES3</TypeScriptTarget> ), su servicio de idioma le dará un garabato rojo si define un get / set en una clase.
    Esto le permite utilizar un conjunto de opciones para el comportamiento del tiempo de construcción y diseño.
    Para que esto funcione, los destinos le dicen al servicio de idiomas que conoce el mecanografiado definiendo una propiedad <TypeScriptEnabled>true</TypeScriptEnabled> .

Si no desea que la compilación en VS funcione, simplemente elimine los objetivos. esto deshabilitará la compilación, pero también le dirá al LS que este proyecto no es un proyecto de TypeScript. y luego tratará todos los archivos como "archivos sueltos". Si esto le parece bien, entonces no se necesita más trabajo. si desea cambiar eso y hacer que todavía use las propiedades de su archivo de proyecto, y no incluir otros archivos abiertos en su proyecto, etc., entonces agregue <TypeScriptEnabled>true</TypeScriptEnabled> a su archivo, y el LS lo tratará en consecuencia .

Si desea que la compilación funcione en VS, pero LS no lo trate como un proyecto, establezca el indicador en falso.

Gracias. Esta es una gran información y todo parece funcionar de manera coherente con lo que ha descrito. Si eliminé el archivo .targets, pero establecí TypeScriptEnabled en verdadero, ¿se espera que la pestaña Compilación de TypeScript desaparezca de las propiedades del proyecto?

  <!--
  <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TypeScript\Microsoft.TypeScript.targets" Condition="Exists('$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TypeScript\Microsoft.TypeScript.targets')" />
  -->
  <PropertyGroup>
    <TypeScriptEnabled>true</TypeScriptEnabled>
  </PropertyGroup>
</Project>

Si es así, esto parece extraño porque significa que no habría forma de controlar las configuraciones a las que se podía acceder en la IU sin volver a habilitar el objetivo y luego usar la IU (o de manera más realista, simplemente editando la configuración del proyecto TS directamente en ese punto ya estás ahí de todos modos).

La razón por la que pregunto todo esto es que escribí una biblioteca npm hace unas semanas para leer las propiedades de compilación de TypeScript de un .csproj y .vbproj (https://www.npmjs.com/package/csproj2ts) que Actualmente me estoy integrando en grunt-ts. Cuando esté listo, habrá una manera fácil de "ejecutar tsc contra un archivo .csproj" (como se solicita aquí: https://github.com/Microsoft/TypeScript/issues/1702). Quiero poder decirle a las personas la mejor manera de configurar su proyecto para usar el servicio de lenguaje VS TypeScript para su experiencia de codificación, pero usar grunt-ts para compilar. Esperaba que fuera posible permitir que las personas usaran la interfaz de usuario para configurar las propiedades de TypeScript en este escenario, pero tal vez no sea así.

¿Conoce alguna forma de que la pestaña Compilación de TypeScript se muestre con el archivo .targets de TypeScript desactivado?

Además, parece que incluso si hago algo como esto: <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TypeScript\Microsoft.TypeScript.targets" Condition=" '$(Configuration)' == 'Debug' " /> , tengo que configurar la configuración del proyecto en Depurar y luego volver a cargar para que aparezca la pestaña Compilación de TypeScript.

Lo siento, @mhegazy , trollear !

¿Se espera que la pestaña Compilación de TypeScript desaparezca de las propiedades del proyecto?

sí, las páginas de propiedades están conectadas a los destinos, por lo que eliminarlas elimina la interfaz de usuario, tendrá que editar manualmente el archivo

La razón por la que pregunto todo esto es que escribí una biblioteca npm hace unas semanas para leer las propiedades de compilación de TypeScript de un .csproj y .vbproj (https://www.npmjs.com/package/csproj2ts) que Actualmente me estoy integrando en grunt-ts.

El escenario que está tratando de lograr es factible, pero tendrá algunas asperezas y tendrá que piratear algunos lugares para que funcione. @paulvanbrenk está agregando soporte para tsconfig en VS, esto permite que las páginas de propiedades del proyecto usen el archivo tsconfig si estuviera allí. También estamos trabajando para integrarnos mejor en los proyectos de ASP.net 5 , que creo que harán todo lo que quieras, a saber: 1. soporte para grubt / bower, 2. una vista basada en el sistema de archivos, 3. usa tsconfig para administrar las propiedades del proyecto y 4. interacción simple con otros editores / IDE. Creo que esto funcionará muy bien con el escenario que está describiendo y no tendrá que abrirse camino para evitarlo. Sin embargo, esto vendrá en la próxima versión, por lo que hay que esperar un poco :)

Además, parece que incluso si hago algo como esto: , Tengo que establecer la configuración del proyecto en Depurar y luego volver a cargar para que aparezca la pestaña Compilación de TypeScript.

Las importaciones se cargan cuando se carga el proyecto. por lo que en esta importación está diciendo cargado solo en 'Configuración' 'Depurar', cambiar la configuración no obliga a recargar.

Lo siento, @mhegazy , trollear !
: D no se preocupe. Siempre me encanta recibir comentarios y espero que eso haya ayudado.

OKAY. De verdad, gracias por tan excelente información y tan exhaustiva discusión.

Solo para lanzarlo a @paulvanbrenk , sería increíble tener algún tipo de forma incluso en el estado futuro con tsconfig para tener la capacidad de deshabilitar la compilación de VisualStudio TypeScript (es decir, CTRL + SHIFT + B construye su C # y etc., pero no TypeScript) y usa un compilador externo de TypeScript mientras deja la capacidad de configurar las opciones de TypeScript a través de la GUI. Hay muchas razones por las que el uso de una herramienta de compilación externa puede ser muy útil y, en este momento, parece que esto solo se admite por accidente y con algunas asperezas.

La idea tsconfig es asombrosa, pero realmente no ayuda con:

  • Usando una versión antigua de TypeScript
  • Usar diferentes versiones de TypeScript en diferentes proyectos en la misma computadora
  • Usar una versión experimental de TypeScript (como la versión de @fdecampredon que admita JSX)
  • Usar una herramienta de compilación como grunt-ts que automatiza la gestión de referencias y realiza otras tareas que TypeScript no admite
  • Etc.

Permitir que los usuarios de Visual Studio elijan un sistema de compilación de TypeScript desarrollado por la comunidad y al mismo tiempo mantener la interfaz de usuario agradable dentro de Visual Studio sería increíble (especialmente con el agradable complemento Task Runner Explorer). Espero que sopesen los importantes beneficios para la comunidad que esto permitiría con el tiempo que le llevaría codificar una casilla de verificación que dice "Desactivar compilación de TypeScript".

Espero que sopesen los importantes beneficios para la comunidad que esto permitiría con el tiempo que le llevaría codificar una casilla de verificación que dice "Desactivar compilación de TypeScript".

Esta es la parte en la que me confundo. para mí, esto es eliminar la referencia de objetivos mecanografiados y luego reemplazarla con sus objetivos grunt que construirán las cosas de manera diferente. me resulta extraño incluir un archivo .targets con una condición que le dice que no haga nada; ¿Por qué incluirlo en primer lugar? Me complacería ayudar a componer un archivo .targets que reemplace los destinos estándar de mecanografiado, este incluirá la etiqueta <TypeScriptEnabled>true</TypeScriptEnabled> y buscará VS como si fuera el predeterminado, pero manejará la compilación de manera diferente.

¿Eh? Debería haber pensado en eso, creo que he estado tratando el archivo .targets como algo inmutable, pero por supuesto esto tiene mucho sentido. Examinaré el formato de archivo de los objetivos y me pondré en contacto contigo.

una manera fácil de comenzar es copiar el archivo de objetivos Microsoft.TypeScript.Target, eliminar cosas que no le interesan, por ejemplo, llamar a tsc, y agregar tareas para llamar a grunt, y conectar la configuración, etc. luego incluirlo en tu proyecto.

¡Increíble! He conseguido que todo funcione desde una perspectiva minimalista configurando mi archivo .csproj con las siguientes 4 líneas.

  <Import Project="$(ProjectDir)\custom.TypeScript.targets" />
  <PropertyGroup>
    <TypeScriptEnabled>true</TypeScriptEnabled>
  </PropertyGroup>

Y el archivo minimalista custom.TypeScript.targets es este:

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <VsToolsPath Condition="'$(VsToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VsToolsPath>
  </PropertyGroup>
  <UsingTask TaskName="TypeScript.Tasks.VsTsc" AssemblyFile="$(VSToolsPath)\TypeScript\TypeScript.tasks.dll" />
  <PropertyGroup>
    <CfgPropertyPagesGuidsAddCSharp>{d4683cae-88c4-4b85-863d-ac8014f3ba36}</CfgPropertyPagesGuidsAddCSharp>
    <CfgPropertyPagesGuidsAddVB>{d4683cae-88c4-4b85-863d-ac8014f3ba36}</CfgPropertyPagesGuidsAddVB>
    <CfgPropertyPagesGuidsAddTypeScript>{d4683cae-88c4-4b85-863d-ac8014f3ba36}</CfgPropertyPagesGuidsAddTypeScript>
  </PropertyGroup>
  <ItemGroup>
    <ProjectCapability Include="TypeScript" />
  </ItemGroup>
</Project>

Intenté poner la etiqueta <TypeScriptEnabled /> en el archivo de destinos, pero no funcionaba (VS trataba los archivos .ts como sueltos). ¿Alguna idea de por qué es eso? (Estoy seguro de que para alguien que conoce MSBuild esto es obvio, ¿tal vez algún tipo de problema de alcance?).

Creo que esto resuelve mi problema en este momento. Puedo ejecutar mi tarea Grunt usando la extensión Task Runner Explorer que puede iniciar tareas Grunt o Gulp cuando se activa una VS Build. La compilación ahora siempre se muestra como exitosa independientemente del resultado de la compilación de TypeScript, pero esto está bien ya que el usuario puede ver la salida de grunt-ts en la ventana de TRX. El panel "Compilación de TypeScript" aparece en la ventana de propiedades del proyecto. Compilar al guardar funciona si se selecciona esa opción. La compilación aún se muestra como fallida si el código C # o VB no se compila correctamente (algo bueno). La configuración para llegar aquí desde una "Aplicación HTML con TypeScript" de Visual Studio o un proyecto web ASP.NET predeterminado es bastante sencilla.

¿Puedes ver algún problema con la distribución del archivo .targets minimalista anterior con grunt-ts? Eso significaría que solo tendríamos que decirle a la gente que actualice la línea .targets de su proyecto a <Import Project="$(ProjectDir)\node_modules\grunt-ts\custom.TypeScript.targets" /> y establezca <TypeScriptEnabled> .

¡¡Gracias de nuevo!!

Intenté poner el en el archivo de destinos, pero no funcionaba (VS estaba tratando los archivos .ts como sueltos). ¿Alguna idea de por qué es eso? (Estoy seguro de que para alguien que conoce MSBuild esto es obvio, ¿tal vez algún tipo de problema de alcance?).

esto es extraño. así es como lo tenemos en nuestros objetivos y funciona bien. ¿Estás incluyendo otros objetivos que tiene la propiedad? alguna condición? Lo probé en un nuevo proyecto ts, eliminé Microsoft.TypeScript.targets, puse el tuyo y agreguécierto y eso funcionó.

¿Puedes ver algún problema con la distribución del archivo .targets minimalista anterior con grunt-ts? Eso significaría que solo tendríamos que decirle a la gente que actualice la línea .targets de su proyecto para y establecer.

Creo que esta es la forma correcta de hacerlo. Solo trataría de obtener TypeScriptEnabled allí también. déjame saber cómo puedo ayudar a diagnosticar el problema

Algunas notas, no necesita la referencia de tasks.dll ni la definición de VsToolsPath, a menos que la necesite para otra cosa.

Veo el comportamiento que predijo en la computadora de mi casa. También funcionó sin la referencia a la DLL. Debo haber cometido algún tipo de error antes, así que lo intentaré de nuevo mañana. ¡Creo que esto es realmente genial! Gracias, Mohamed. Esto debería publicarse como parte de grunt-ts en los próximos días.

Una cosa que podría estar causando esto es que los archivos de destino solo se cargan una vez en VS, por lo que si edita los destinos, los cambios no se reflejarán en su proyecto hasta que reinicie VS.

Eso podría haber sido todo; Estaba descargando / recargando el proyecto. Es posible que reinicié VS en casa. Tomaré nota de eso en los documentos.

@mhegazy Gracias por toda tu ayuda. Lanzamos grunt-ts 4.0.0, que contiene la función "compilar desde Visual Studio Project":

https://github.com/TypeStrong/grunt-ts#vs

Instrucciones para deshabilitar la compilación VS:

https://github.com/TypeStrong/grunt-ts/blob/master/docs/DisableVisualStudioBuild.md

¡Muy genial! Me encantan los escenarios que esto permite.

Gracias, Ryan. Estoy bastante satisfecho con el resultado. Cuando surja tsconfig, puede que sea menos necesario, pero esto cerrará la brecha hasta entonces y, por supuesto, es compatible con las versiones del compilador TypeScript anteriores a la 1.5.

PD: Ha habido dos informes de errores hoy, por lo que deberíamos lanzar una 4.0.1 esta noche asumiendo que puedo corregirlos.

Solo para su información, en VS2015 RTM hay una forma más fácil de deshabilitar TypeScriptCompile:
Simplemente agregue <TypeScriptCompileBlocked>true</TypeScriptCompileBlocked> al .csproj , por ejemplo, en el primer <PropertyGroup> .

Gracias.

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

uber5001 picture uber5001  ·  3Comentarios

Antony-Jones picture Antony-Jones  ·  3Comentarios

DanielRosenwasser picture DanielRosenwasser  ·  3Comentarios

MartynasZilinskas picture MartynasZilinskas  ·  3Comentarios

manekinekko picture manekinekko  ·  3Comentarios