自定义Gradle Visual-Studio插件以生成vcxproj.user

时间:2016-08-19 13:25:30

标签: gradle

我正在尝试自定义默认的Visual-Studio Gradle Plugin任务,以便在vcxproj文件中为可执行文件的解决方案中的每个项目生成一个vcxproj.user文件(我想跳过库)。

我的想法是找到GenerateProjectFileTask类型的所有任务,以某种方式过滤那些代表可执行二进制文件的任务(这部分我不知道该怎么做)和一个finalizedBy子句使它们运行我的任务这也将生成.user文件。

我需要这个,因为我的项目有一个自定义Working Directory路径,每次添加新的源文件等时我都必须重新生成项目。显然当我这样做时(清理后)我必须设置这些路径每个可执行文件再次。这很烦人。

到目前为止我试图做的是

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"
            }
        }
    }
}

但它始终打印Project is null,我不明白为什么。我需要知道生成文件的路径。

此外,我不喜欢finalizedBy子句,因为无论最终任务是否失败,它始终都会运行。这个问题有更好的解决方案吗?

简而言之,我想要实现的是当我运行一个任务时:gradlew demoAppVisualStudio它不仅应该生成解决方案和所有必需的项目,还应该为代表可执行文件的项目运行我生成的任务来创建additonal vcxproj。我将准备的内容的用户文件(主要是<LocalDebuggerWorkingDirectory>部分)

1 个答案:

答案 0 :(得分:1)

好的,因为没有答案我会回答我自己的问题,因为我解决了问题,虽然我对它不是最开心,因为它不是很漂亮我猜:

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"
              }
            }
          }
        }
      }
    }
  }
}