2010-09-22 8 views
6

Quiero agregar mi propio tipo de proyecto basado en IronStudio. Así,Crear un paquete de Visual Studio basado en otro

  • He descargado la fuente y compilado por the latest version of IronPython, entonces
  • He creado un nuevo paquete de Visual Studio.
  • Agregué las carpetas Templates\Projects\MyProject, agregué un archivo y establecí su propiedad "Incluir en VSIX" en verdadero.

modifica entonces la clase del paquete principal que se deriva de IronStudio de PythonProjectPackage lugar y establezca la propiedad ProvideProjectFactory:

[ProvideProjectFactory(
    typeof(PythonProjectFactory), 
    "Django Project", 
    "Django Project Files (*.myproj);*.myproj", 
    "myproj", "myproj", 
    @"Templates\Projects\MyProject", 
    LanguageVsTemplate="MyProject")] 
public sealed class MyPackage : PythonProjectPackage 

y la pasó. Pero MyProject no se muestra en las plantillas del proyecto. Por qué no?

El .pkgdef archivo generado se parece a esto:

[$RootKey$\InstalledProducts\VSPackage3Package] 
@="#110" 
"Package"="{5cd7435c-7461-459f-80bc-c0c79e9d462f}" 
"PID"="1.0" 
"ProductDetails"="#112" 
"LogoID"="#400" 
[$RootKey$\Packages\{5cd7435c-7461-459f-80bc-c0c79e9d462f}] 
@="Microsoft.VSPackage3.VSPackage3Package, VSPackage3, Version=1.0.0.0, Culture=neutral, PublicKeyToken=a4f1577d825253f8" 
"InprocServer32"="$WinDir$\SYSTEM32\MSCOREE.DLL" 
"Class"="Microsoft.VSPackage3.VSPackage3Package" 
"CodeBase"="$PackageFolder$\VSPackage3.dll" 
[$RootKey$\Editors\{888888c4-36f9-4453-90aa-29fa4d2e5706}] 
"Package"="{5cd7435c-7461-459f-80bc-c0c79e9d462f}" 
[$RootKey$\Editors\{888888c4-36f9-4453-90aa-29fa4d2e5706}\Extensions] 
"py"=dword:00000020 
[$RootKey$\Editors\{888888c4-36f9-4453-90aa-29fa4d2e5706}\LogicalViews] 
"{7651a701-06e5-11d1-8ebd-00a0c90f26ea}"="" 
[$RootKey$\Editors\{888888c4-36f9-4453-90aa-29fa4d2e5706}\LogicalViews] 
"{7651a702-06e5-11d1-8ebd-00a0c90f26ea}"="" 
[$RootKey$\Editors\{888888c4-36f9-4453-90aa-29fa4d2e5706}\LogicalViews] 
"{7651a703-06e5-11d1-8ebd-00a0c90f26ea}"="" 
[$RootKey$\CLSID\{888888fd-3c4a-40da-aefb-5ac10f5e8b30}] 
@="Microsoft.IronPythonTools.Project.PythonGeneralPropertyPage" 
"InprocServer32"="$WinDir$\SYSTEM32\MSCOREE.DLL" 
"Class"="Microsoft.IronPythonTools.Project.PythonGeneralPropertyPage" 
"CodeBase"="$PackageFolder$\VSPackage3.dll" 
"ThreadingModel"="Both" 
[$RootKey$\Projects\{888888a0-9f3d-457c-b088-3a5042f75d52}] 
@="PythonProjectFactory" 
"DisplayName"="My Project" 
"DisplayProjectFileExtensions"="My Project Files (*.myproj);*.myproj" 
"Package"="{5cd7435c-7461-459f-80bc-c0c79e9d462f}" 
"DefaultProjectExtension"="myproj" 
"PossibleProjectExtensions"="myproj" 
"ProjectTemplatesDir"="$PackageFolder$\Templates\Projects\MyProject" 
"Language(VsTemplate)"="MyProject" 
[$RootKey$\NewProjectTemplates\TemplateDirs\{5cd7435c-7461-459f-80bc-c0c79e9d462f}\/1] 
@="My Project" 
"SortPriority"=dword:00000064 
"TemplatesDir"="$PackageFolder$\Templates\Projects\MyProject" 
[$RootKey$\Projects\{888888a0-9f3d-457c-b088-3a5042f75d52}] 
@="PythonProjectFactory" 
"DisplayName"="IronPython" 
"DisplayProjectFileExtensions"="IronPython Project Files (*.pyproj);*.pyproj" 
"Package"="{5cd7435c-7461-459f-80bc-c0c79e9d462f}" 
"DefaultProjectExtension"="pyproj" 
"PossibleProjectExtensions"="pyproj" 
"ProjectTemplatesDir"="$PackageFolder$\.\NullPath" 
"Language(VsTemplate)"="IronPython" 
[$RootKey$\NewProjectTemplates\TemplateDirs\{5cd7435c-7461-459f-80bc-c0c79e9d462f}\/1] 
@="IronPython" 
"SortPriority"=dword:00000064 
"TemplatesDir"="$PackageFolder$\.\NullPath" 
[$RootKey$\Services\{b98e41c4-581e-3532-beee-06829b683d39}] 
@="{5cd7435c-7461-459f-80bc-c0c79e9d462f}" 
"Name"="IPythonStarter" 

sólo quiero conseguir el esqueleto en funcionamiento para que pueda empezar anulando algunas funciones (como el cuadro de diálogo Agregar nuevo elemento).

+0

Acabo de darme cuenta de que 'PythonProjectFactory' aparece allí dos veces ... probablemente no como debería ser. – mpen

+0

De hecho, tenga en cuenta que hay más líneas duplicadas, como p. Ej. el GUID anterior, consulte [mi respuesta] (http://stackoverflow.com/q/3766065#3834459) para obtener más información al respecto. –

Respuesta

1

Esta publicación stackoverflow podría ser útil: VS2010: VSIX installation doesn't deploy item templates inside it

Si esto no es lo que está buscando, tratar de ver si se está perdiendo algo en torno a la creación de plantillas de proyectos a medida, creo que es donde el " eslabón perdido" es:

Espero que esto ayude

+1

La mayoría de esos enlaces parecen describir cómo crear nuevas plantillas de proyectos ... Ya lo he hecho, pedazo de torta. Sin embargo, necesito más poder que eso, necesito modificar el proceso de compilación y ejecución, y agregar elementos al menú contextual. Para eso, estoy bastante seguro de que necesito crear un VSPackage. Lo cual también descubrí cómo hacer (http://stackoverflow.com/questions/3713503/how-to-create-a-new-project-type-in-vs2010/3713769#3713769), la parte que estoy luchando específicamente, está extendiendo IronPython. Su primer enlace es un poco más relevante (como por lo menos un paso en la dirección correcta), – mpen

+0

pero la respuesta fue básicamente "mirar de nuevo", lo cual ... lo hice ... varias veces. – mpen

+0

Una "nueva plantilla de artículo" es una de las características más grandes que quiero implementar ... excepto que necesita agregar un archivo, modificar otras dos, por lo que es un poco más complicado. Eso, y tenga en cuenta el contexto ("crear una nueva plantilla de vista para la función resaltada"). – mpen

0

$ PackageFolder $. \ NullPath puede tener algo que ver con eso.

+0

Ese archivo se genera automáticamente ; Estoy seguro de que hay muchos defectos con él, pero dado que no puedo editar ese archivo directamente, realmente no me ayuda. – mpen

5

Actualización:

lectura de mi análisis inicial una vez más aumenta mi impresión de que algunos de los componentes necesarios están desaparecidos (por ejemplo, un dedicado ProjectFactory) y/o cableado incorrectamente - de la documentación de MSDN de la ProvideProjectFactoryAttribute Class:

ProvideProjectFactoryAttribute declara que un paquete proporciona una fábrica de proyecto.

Y más adelante:

Si un VSPackage declara que proporciona una fábrica de proyectos, se debe crear la fábrica y ofrecerlo a Visual Studio en el método de inicialización de la clase derivada de paquete.

Usted está declarando paquete para proporcionar PythonProjectFactory, pero (probablemente) no ofrece a VS, sino que es ofrecido por el paquete IronPython. A su vez, proporciona argumentos dentro de la lista de atributos ProvideProjectFactory que PythonProjectFactory no sabrá cuando lo solicite VS.

En consecuencia, al menos debe proporcionar un ProjectFactory dedicado según el tutorial, cablear las clases en consecuencia y ver cómo resulta esto con respecto a los problemas descritos a continuación.


análisis inicial:

Parece que hay varios problemas aquí en la primera vista - ¿ha seguido ningún tutorial sobre cómo hacer esto? En el caso, tenga en cuenta que algunos de los fácilmente detectables a través de los motores de búsqueda todavía están desactualizados. De cualquier manera, trataría de trabajar y/o comparar su resultado con Walkthrough: Part 1 - Creating a Basic Project System de la documentación de MSDN para VS 2010; tenga en cuenta que incluso este se afirma que está obsoleto un poco según la sección Contenido de la comunidad en la parte inferior de la página.

Esto es lo que me vería en mí mismo dado el código que presenta, en comparación con el tutorial sobre la marcha para más ideas:

  • usted ya se dio cuenta de que el fragmento duplicado comenzando con el GUID arriba PythonProjectFactory no tiene sentido - esto esencialmente intenta registrar dos paquetes a la vez, lo cual, incluso si se permite sintácticamente (lo cual dudo), posiblemente no funcione así debido a que ambos están registrados con el mismo GUID [ verificación cruzada con el archivo de muestra en la sección Examinando la plantilla Registro confirma esta sospecha, como se esperaba, solo hay uno de esos fragmentos].

    • Tenga en cuenta que el GUID en cuestión es el de identificar PythonProjectFactory (según el código fuente correspondiente), ver más abajo para más información sobre esto.
 [Guid(PythonConstants.ProjectFactoryGuid)] 
     public class PythonProjectFactory : ProjectFactory { 
  • Dada .pkgdef es un archivo generado la siguiente pregunta es dónde esta duplicación/violación se deriva de. Cuando dos artefactos generados terminan con el mismo GUID, la definición respectiva en las fuentes probablemente se arruine de alguna manera, generalmente debido a la copia & de la duplicación de pegado. Por lo tanto, debe verificar si {5cd7435c-7461-459f-80bc-c0c79e9d462f} está definido y referenciado como debe ser, aunque aquí también puede haber una o dos causas más para esto, consulte a continuación.

  • A Package class necesita ser identificado por un GUID y el asistente VS genera algunos ya en Guids.cs y referencias en consecuencia en la definición de clase, sin embargo, la siguiente no se encuentra en su fragmento [verificación cruzada con el fragmento de la muestra en la sección Para registrar la plantilla de proyecto confirma esta omisión también]:

[Guid(GuidList.guidMyPackagePkgString)] 
    public sealed class MyPackage : Package 
  • mismo modo que parece incorrecto para derivar MyPackage de PythonProjectPackage pero referencia PythonProjectFactory todavía en lugar de proporcionar MyFactory también (incluyendo un GUID dedicado), ya que este último indica a Visual Studio la ubicación de la carpeta de plantilla de proyecto [véase la sección Creación de una esquelética fábrica Proyecto]:

    • Aunque bien podría ser posible simplemente volver a utilizar toda la funcionalidad de la clase base PythonProjectFactory, es probable que se requiere simplemente heredar porque la fábrica debe tener un GUID dedicado también (como se indica en la w Alivio) para cablear correctamente los datos especificados por el atributo.

  • Probablemente no relacionado, pero todavía es sospechoso que sus dos bloques de código no se relacionan, como la definición Package class especifica Django archivos de proyecto (* .myproj); *. Miproyecto, sin embargo, el resultado muestra Mis archivos de proyecto (* .myproj); *. myproj.

    • ¿Por casualidad ha mezclado esto de diferentes compilaciones o es realmente el resultado de uno limpio?

Buena suerte!

+0

Esta respuesta parece que tiene algún mérito, pero estoy demasiado agotado para ir a través de este momento. Tendré que investigar esto cuando tenga algo de tiempo. ¡Gracias! – mpen

Cuestiones relacionadas