Title: What is the right way to implement deprecation in PowerShell? · Issue #11674 · PowerShell/PowerShell · GitHub
Open Graph Title: What is the right way to implement deprecation in PowerShell? · Issue #11674 · PowerShell/PowerShell
X Title: What is the right way to implement deprecation in PowerShell? · Issue #11674 · PowerShell/PowerShell
Description: Follow-up from #11662 (comment): Context: Note: Deprecation in the context of PowerShell is always "soft" deprecation in the sense that, given the commitment to backward compatibility, features are never removed, so that old code continu...
Open Graph Description: Follow-up from #11662 (comment): Context: Note: Deprecation in the context of PowerShell is always "soft" deprecation in the sense that, given the commitment to backward compatibility, features are...
X Description: Follow-up from #11662 (comment): Context: Note: Deprecation in the context of PowerShell is always "soft" deprecation in the sense that, given the commitment to backward compatibility, fe...
Opengraph URL: https://github.com/PowerShell/PowerShell/issues/11674
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"What is the right way to implement deprecation in PowerShell?","articleBody":"Follow-up from https://github.com/PowerShell/PowerShell/issues/11662#issuecomment-577861216:\r\n\r\n### Context:\r\n\r\nNote: _Deprecation_ in the context of PowerShell is _always_ \"soft\" deprecation in the sense that, given the commitment to backward compatibility, features are never _removed_, so that old code _continues to function_. Instead, deprecation means _discouraging use_ of a given feature, for various reasons: having been superseded by a superior alternative, general obsoleteness, security concerns.\r\n\r\nDeprecation can be implemented in the following, potentially complementary ways:\r\n\r\n* _Documentation_ warnings: Clearly state that a given cmdlet / one of its parameters is deprecated and should not be used in new code.\r\n\r\n* _Design-time_ warnings: Implement a PSScriptAnalyzer (PSSA) warning that is ideally also surfaced in Visual Studio Code, via the PowerShell extension's integrated PowerShell Editor Services (PSES). \r\nThis is currently mostly _not_ implemented (see details below).\r\n\r\n* _Runtime_ warnings:\r\nCurrently, a warning (to stream `3`) is emitted when a deprecated feature is called.\r\n\r\nThe latter are currently implemented by a _repurposing_ of the general [`System.ObsoleteAttribute`](https://docs.microsoft.com/en-US/dotnet/api/System.ObsoleteAttribute) attribute, whose purpose is to provide _compile-time_ warnings (and optionally _errors_) about obsolete features: given that PowerShell code isn't compiled, the PowerShell engine explicitly surfaces `Obsolete` attributes on _cmdlets_ or their _parameters_ (but seemingly not SDK classes with the attribute) with a PowerShell warning _at runtime_.\r\n\r\nExamples of features currently deprecated this way are `Send-MailMessage` and the `-Raw` parameter of the `Format-Hex` cmdlet; e.g.:\r\n\r\n```powershell\r\nPS\u003e 'foo' | Format-Hex -Raw\r\nWARNING: Parameter 'Raw' is obsolete. Raw parameter is deprecated.\r\n... # regular output\r\n```\r\n\r\n`3\u003e$null` or `-WarningAction Ignore` can be used to suppress the warning, but old code written pre-deprecation _will_ show the warning.\r\n\r\nAs an aside: The combination of the boilerplate part of the warning (`Parameter 'Raw' is obsolete`) with the attribute-specific message (`Raw parameter is deprecated`) could use some revising.\r\n\r\n----\r\n\r\n### Relevant questions are:\r\n\r\n* Should deprecation be signaled _at runtime_ at all?\r\n * If so, is the current approach the right one?\r\n\r\n* Is it sufficient to warn at _design time_, knowing that not every user will see those warnings, given that they may use an editor other than Visual Studio Code and not install and routinely run `Invoke-ScriptAnalyzer` after installing the [`PSScriptAnalyzer`](https://www.powershellgallery.com/packages/PSScriptAnalyzer/) module?\r\n\r\n * As of this writing, PSSA (warning) rules seems to comprise just _one_ relating to one specific deprecated feature, [`AvoidUsingDeprecatedManifestFields`](https://github.com/PowerShell/PSScriptAnalyzer/blob/master/RuleDocumentation/AvoidUsingDeprecatedManifestFields.md), whereas several more deprecated features exist - full list of rules is [here](https://github.com/PowerShell/PSScriptAnalyzer/tree/master/RuleDocumentation).\r\n\r\n * Perhaps a more promising approach is to let PSSA directly surface `Obsolete` attributes encountered in code, if technically feasible.","author":{"url":"https://github.com/mklement0","@type":"Person","name":"mklement0"},"datePublished":"2020-01-24T16:11:23.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":48},"url":"https://github.com/11674/PowerShell/issues/11674"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:00c0af68-e326-e354-3789-814a688d1b99 |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | D5C0:8AE8C:8C6CDE:C67BBC:6A4E7E33 |
| html-safe-nonce | 8a65c3622af5e94cac42026cd151a0287203bb40c2a102d6f117c1a6f05fe8ce |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJENUMwOjhBRThDOjhDNkNERTpDNjdCQkM6NkE0RTdFMzMiLCJ2aXNpdG9yX2lkIjoiODA0MTMxMjIzODk0NDgxMjU5NSIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9 |
| visitor-hmac | 40193f2f1c181e53bccaa5bd73fc06bee6492f2228b03eb0a56137289d41c792 |
| hovercard-subject-tag | issue:554824170 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/PowerShell/PowerShell/11674/issue_layout |
| twitter:image | https://opengraph.githubassets.com/eeb3e73e728686f1cbc4a94bc997ee9468e851b1bf77b9f913fb883d6c8334bd/PowerShell/PowerShell/issues/11674 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/eeb3e73e728686f1cbc4a94bc997ee9468e851b1bf77b9f913fb883d6c8334bd/PowerShell/PowerShell/issues/11674 |
| og:image:alt | Follow-up from #11662 (comment): Context: Note: Deprecation in the context of PowerShell is always "soft" deprecation in the sense that, given the commitment to backward compatibility, features are... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | mklement0 |
| hostname | github.com |
| expected-hostname | github.com |
| None | 41b6ab3ba6d20a71766ac245b5a4a94c6fc672a9cd4da7d44c1b33ab8bf6a21c |
| turbo-cache-control | no-preview |
| go-import | github.com/PowerShell/PowerShell git https://github.com/PowerShell/PowerShell.git |
| octolytics-dimension-user_id | 11524380 |
| octolytics-dimension-user_login | PowerShell |
| octolytics-dimension-repository_id | 49609581 |
| octolytics-dimension-repository_nwo | PowerShell/PowerShell |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 49609581 |
| octolytics-dimension-repository_network_root_nwo | PowerShell/PowerShell |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | e6a744804e8e70f97b4d5a18a94dcc63db22f97a |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width