2016-08-19 1 views
1

J'essaie de personnaliser les tâches Visual-Studio Gradle Plugin par défaut pour générer un fichier vcxproj.user le long du fichier vcxproj pour chaque projet dans une solution qui est un exécutable (je veux sauter des bibliothèques). L'idée était de trouver toutes les tâches de type GenerateProjectFileTask, de filtrer d'une manière ou d'une autre uniquement celles qui représentent un binaire exécutable (cette partie que je ne sais pas encore faire) et une clause finalizedBy pour les faire exécuter ma tâche générera également le fichier .user.Personnaliser Gradle Visual-Studio Plugin pour générer vcxproj.user

J'ai besoin de cela depuis mon projet a un chemin d'accès personnalisé Working Directory et je dois régénérer le projet chaque fois que j'ajoute de nouveaux fichiers source etc. et évidemment quand je le fais (après nettoyage) je dois redéfinir ces chemins pour chaque exécutable C'est assez agaçant.

Ce que je tentais de faire jusqu'à présent était

subprojects { 
    // every proejct with plugin cpp also uses visual-studio plugin 
    plugins.withId('cpp') { 
     afterEvaluate { 
      tasks.withType(GenerateProjectFileTask) { task -> 
       def project = task.getVisualStudioProject() 
       if(project != null) { 
        println project.projectFile.location 
       } 
       else { 
        println "Project is null" 
       } 
       //println task.getOutputFile().getPath() <- this didnt work either 
       task.finalizedBy "someGeneratedTaskForEachProjectToCreateUserProperties" 
      } 
     } 
    } 
} 

Mais il imprime toujours Project is null et je ne comprends pas pourquoi. J'ai besoin du chemin pour savoir où générer le fichier.

Aussi, je n'aime pas la clause finalizedBy car elle fonctionne toujours peu importe si la tâche finalisée a échoué ou non. Y a-t-il une meilleure solution à ce problème? En bref, ce que je veux réaliser est quand je lance une tâche par exemple: gradlew demoAppVisualStudio il devrait générer non seulement la solution et tous les projets nécessaires, mais aussi exécuter mes tâches générées pour les projets qui représentent l'exécutable pour créer un fichier vcxproj.user additonal avec contenu Je vais préparer (principalement la partie <LocalDebuggerWorkingDirectory>)

Répondre

1

Ok, comme il n'y a pas de réponses je vais répondre à ma propre question puisque j'ai résolu le problème bien que je n'étais pas le plus heureux avec elle, car ce n'est pas joli je deviner:

subprojects { subproj -> 
    plugins.withId('cpp') { 
    model { 
     components { 
     withType(NativeExecutableSpec) { c -> 
      subproj.tasks.whenTaskAdded { 
      if(it.name == "${c.name}VisualStudio") { 

       it.dependsOn task("${c.name}_${c.name}VisualStudioUserProperties", type:Task) { 

       def projectTask = tasks["${c.name}_${c.name}ExeVisualStudioProject"] 
       def path = projectTask.outputs.files.singleFile.parentFile.absolutePath 
       def outputPath = "${path}/${c.name}_${c.name}Exe.vcxproj.user" 

       inputs.file(file("data/vsDebuggerWorkingDirectory.xml")) 
       outputs.file(outputPath) 

       doLast { 
        new File(outputPath).write(("${inputs.files.singleFile.text}")) 
       } 
       mustRunAfter "${c.name}_${c.name}ExeVisualStudioProject" 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
}