Skip to content

Commit

Permalink
Merge pull request #882 from JetBrains/rival/fix-881
Browse files Browse the repository at this point in the history
Do not require `launchSettings.json` to run a Function project
  • Loading branch information
rafaelldi authored Aug 16, 2024
2 parents 964c962 + 8dcb48d commit 20a5289
Show file tree
Hide file tree
Showing 8 changed files with 187 additions and 132 deletions.
4 changes: 4 additions & 0 deletions PluginsAndFeatures/azure-toolkit-for-rider/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@

## [Unreleased]

### Changed

- Do not require `launchSettings.json` to run a Function project ([#881](https://github.com/JetBrains/azure-tools-for-intellij/issues/881))

## [4.0.0] - 2024-08-13

### Added
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,9 +73,6 @@ class FunctionRunConfigurationParameters(
val project = runnableProjects.singleOrNull {
it.projectFilePath == projectFilePath && it.kind == AzureRunnableProjectKinds.AzureFunctions
} ?: throw RuntimeConfigurationError(DotNetProjectConfigurationParameters.PROJECT_NOT_SPECIFIED)
if (profileName.isEmpty()) {
throw RuntimeConfigurationError(RiderRunBundle.message("launch.profile.is.not.specified"))
}
if (!trackWorkingDirectory) {
val workingDirectoryFile = File(workingDirectory)
if (!workingDirectoryFile.exists() || !workingDirectoryFile.isDirectory)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ class FunctionRunConfigurationProducer : LazyRunConfigurationProducer<FunctionRu
trackUrl = true
startBrowserParameters.apply {
url = getApplicationUrl(launchProfile?.content, projectOutput, null)
startAfterLaunch = launchProfile?.content?.launchBrowser ?: false
startAfterLaunch = launchProfile?.content?.launchBrowser == true
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,15 @@ import com.intellij.execution.RunnerAndConfigurationSettings
import com.intellij.execution.configurations.ConfigurationTypeBase
import com.intellij.openapi.project.Project
import com.jetbrains.rd.util.lifetime.Lifetime
import com.jetbrains.rider.model.ProjectOutput
import com.jetbrains.rider.model.RunnableProject
import com.jetbrains.rider.model.RunnableProjectKind
import com.jetbrains.rider.run.AutoGeneratedRunConfigurationManager
import com.jetbrains.rider.run.configurations.IRunConfigurationWithDefault
import com.jetbrains.rider.run.configurations.IRunnableProjectConfigurationType
import com.jetbrains.rider.run.configurations.RunConfigurationHelper.hasConfigurationForNameAndTypeId
import com.jetbrains.rider.run.configurations.controls.LaunchProfile
import com.jetbrains.rider.run.configurations.launchSettings.LaunchSettingsJson
import com.jetbrains.rider.run.configurations.launchSettings.LaunchSettingsJsonService
import com.microsoft.azure.toolkit.ide.common.icon.AzureIcons
import com.microsoft.azure.toolkit.intellij.common.IntelliJAzureIcons
Expand All @@ -24,6 +27,7 @@ import com.microsoft.azure.toolkit.intellij.legacy.function.launchProfiles.getAp
import com.microsoft.azure.toolkit.intellij.legacy.function.launchProfiles.getArguments
import com.microsoft.azure.toolkit.intellij.legacy.function.launchProfiles.getEnvironmentVariables
import com.microsoft.azure.toolkit.intellij.legacy.function.launchProfiles.getWorkingDirectory
import com.microsoft.azure.toolkit.intellij.legacy.function.localsettings.FunctionLocalSettings
import com.microsoft.azure.toolkit.intellij.legacy.function.localsettings.FunctionLocalSettingsService

class FunctionRunConfigurationType : ConfigurationTypeBase(
Expand Down Expand Up @@ -57,39 +61,26 @@ class FunctionRunConfigurationType : ConfigurationTypeBase(
val result = mutableListOf<Pair<RunnableProject, RunnerAndConfigurationSettings>>()

functionProjects.forEach { runnableProject ->
LaunchSettingsJsonService.loadLaunchSettings(runnableProject)?.profiles?.forEach { profile ->
if (!profile.value.commandName.equals("Project", true))
return@forEach

if (hasRunConfigurationEverBeenGenerated(
autoGeneratedRunConfigurationManager,
runnableProject.projectFilePath,
profile.key
)
) return@forEach

val configurationName =
if (runnableProject.name == profile.key) profile.key
else "${runnableProject.name}: ${profile.key}"

if (runManager.hasConfigurationForNameAndTypeId(configurationName, ID))
return@forEach

val configuration = generateConfigurationForProfile(
configurationName,
val launchProfiles = LaunchSettingsJsonService.loadLaunchSettings(runnableProject)?.profiles
if (launchProfiles != null) {
generateConfigurationForProfiles(
launchProfiles,
runnableProject,
profile.key,
runManager,
autoGeneratedRunConfigurationManager,
project
)

runManager.addConfiguration(configuration)
markProjectAsAutoGenerated(
).forEach {
result.add(runnableProject to it)
}
} else {
generateConfigurationForRunnableProject(
runnableProject,
runManager,
autoGeneratedRunConfigurationManager,
runnableProject.projectFilePath,
profile.key
)
result.add(runnableProject to configuration)
project
)?.let {
result.add(runnableProject to it)
}
}
}

Expand All @@ -99,7 +90,7 @@ class FunctionRunConfigurationType : ConfigurationTypeBase(
private fun hasRunConfigurationEverBeenGenerated(
autoGeneratedRunConfigurationManager: AutoGeneratedRunConfigurationManager,
projectFilePath: String,
profileName: String
profileName: String = "Default"
) = autoGeneratedRunConfigurationManager.hasRunConfigurationEverBeenGenerated(
projectFilePath,
mapOf(
Expand All @@ -110,7 +101,7 @@ class FunctionRunConfigurationType : ConfigurationTypeBase(
private fun markProjectAsAutoGenerated(
autoGeneratedRunConfigurationManager: AutoGeneratedRunConfigurationManager,
projectFilePath: String,
profileName: String
profileName: String = "Default"
) {
autoGeneratedRunConfigurationManager.markProjectAsAutoGenerated(
projectFilePath,
Expand All @@ -120,6 +111,54 @@ class FunctionRunConfigurationType : ConfigurationTypeBase(
)
}

private fun generateConfigurationForProfiles(
launchProfiles: Map<String, LaunchSettingsJson.Profile>,
runnableProject: RunnableProject,
runManager: RunManager,
autoGeneratedRunConfigurationManager: AutoGeneratedRunConfigurationManager,
project: Project
): List<RunnerAndConfigurationSettings> {
val configurations = mutableListOf<RunnerAndConfigurationSettings>()

launchProfiles.forEach { profile ->
if (!profile.value.commandName.equals("Project", true))
return@forEach

if (hasRunConfigurationEverBeenGenerated(
autoGeneratedRunConfigurationManager,
runnableProject.projectFilePath,
profile.key
)
) return@forEach

val configurationName =
if (runnableProject.name == profile.key) profile.key
else "${runnableProject.name}: ${profile.key}"

if (runManager.hasConfigurationForNameAndTypeId(configurationName, ID))
return@forEach

val configuration = generateConfigurationForProfile(
configurationName,
runnableProject,
profile.key,
runManager,
project
)

runManager.addConfiguration(configuration)
markProjectAsAutoGenerated(
autoGeneratedRunConfigurationManager,
runnableProject.projectFilePath,
profile.key
)

configurations.add(configuration)
}

return configurations
}

private fun generateConfigurationForProfile(
name: String,
runnableProject: RunnableProject,
Expand All @@ -128,34 +167,75 @@ class FunctionRunConfigurationType : ConfigurationTypeBase(
project: Project
): RunnerAndConfigurationSettings {
val settings = runManager.createConfiguration(name, factory)
val launchProfile = FunctionLaunchProfilesService
.getInstance(project)
.getLaunchProfileByName(runnableProject, profile)
val projectOutput = runnableProject.projectOutputs.firstOrNull()
val localFunctionSettings = FunctionLocalSettingsService
.getInstance(project)
.getFunctionLocalSettings(runnableProject)
(settings.configuration as? FunctionRunConfiguration)?.parameters?.apply {
projectFilePath = runnableProject.projectFilePath
profileName = profile
val projectOutput = runnableProject.projectOutputs.firstOrNull()
projectTfm = projectOutput?.tfm?.presentableName ?: ""
functionNames = ""
val launchProfile = FunctionLaunchProfilesService
.getInstance(project)
.getLaunchProfileByName(runnableProject, profile)
if (launchProfile != null) {
arguments = getArguments(launchProfile.content, projectOutput)
trackArguments = true
workingDirectory = getWorkingDirectory(launchProfile.content, projectOutput)
trackWorkingDirectory = true
envs = getEnvironmentVariables(launchProfile.content)
trackEnvs = true
useExternalConsole = false
startBrowserParameters.apply {
url = getApplicationUrl(launchProfile.content, projectOutput, localFunctionSettings)
startAfterLaunch = launchProfile.content.launchBrowser
}
trackUrl = true
}
}
(settings.configuration as? FunctionRunConfiguration)?.updateConfigurationParameters(
runnableProject,
launchProfile,
projectOutput,
localFunctionSettings
)

return settings
}

private fun generateConfigurationForRunnableProject(
runnableProject: RunnableProject,
runManager: RunManager,
autoGeneratedRunConfigurationManager: AutoGeneratedRunConfigurationManager,
project: Project
): RunnerAndConfigurationSettings? {
if (hasRunConfigurationEverBeenGenerated(autoGeneratedRunConfigurationManager, runnableProject.projectFilePath))
return null

val configurationName = runnableProject.name
if (runManager.hasConfigurationForNameAndTypeId(configurationName, ID))
return null

val settings = runManager.createConfiguration(configurationName, factory)
val projectOutput = runnableProject.projectOutputs.firstOrNull()
val localFunctionSettings = FunctionLocalSettingsService
.getInstance(project)
.getFunctionLocalSettings(runnableProject)
(settings.configuration as? FunctionRunConfiguration)?.updateConfigurationParameters(
runnableProject,
null,
projectOutput,
localFunctionSettings
)

runManager.addConfiguration(settings)
markProjectAsAutoGenerated(autoGeneratedRunConfigurationManager, runnableProject.projectFilePath)

return settings
}

private fun FunctionRunConfiguration.updateConfigurationParameters(
runnableProject: RunnableProject,
launchProfile: LaunchProfile?,
projectOutput: ProjectOutput?,
localFunctionSettings: FunctionLocalSettings?
) = parameters.apply {
projectFilePath = runnableProject.projectFilePath
profileName = launchProfile?.name ?: ""
projectTfm = projectOutput?.tfm?.presentableName ?: ""
functionNames = ""
arguments = getArguments(launchProfile?.content, projectOutput)
trackArguments = true
workingDirectory = getWorkingDirectory(launchProfile?.content, projectOutput)
trackWorkingDirectory = true
envs = getEnvironmentVariables(launchProfile?.content)
trackEnvs = true
useExternalConsole = false
startBrowserParameters.apply {
url = getApplicationUrl(launchProfile?.content, projectOutput, localFunctionSettings)
startAfterLaunch = launchProfile?.content?.launchBrowser == true
}
trackUrl = true
}
}
Loading

0 comments on commit 20a5289

Please sign in to comment.