我有这样的情况:
我的项目目录中有一个 .proj 文件:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Compile Include="PQExtensionTest.pq">
<SubType>Code</SubType>
</Compile>
<Content Include="PQExtensionTest.query.pq">
<SubType>Code</SubType>
</Content>
</ItemGroup>
<!-- <Import Project="..\Directory.Build.props" /> -->
<Import Project="$(aProperty)add.targets" />
</Project>
Run Code Online (Sandbox Code Playgroud)
在解决方案目录(项目目录中的..\)中,我有文件 Directory.Build.props:
<Project DefaultTargets="BuildExtension" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<aProperty>$(MSBuildProjectDirectory)/Subdir/</aProperty>
</PropertyGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)
在项目目录中,我有子目录“Subdir”,其中有文件 add.targets,其中包含我需要的所有目标(不显示它包含在此处,因为它与问题无关)。
所以以上都有这个文件夹结构:
Solution directory
Directory.Build.props
Project Directory
Project.mproj
Subdir
add.targets
Run Code Online (Sandbox Code Playgroud)
准备好上述所有内容后,我预计 aProperty 将在导入之前启动,并且 add.targets 的导入将顺利进行。但我收到错误消息,指出未找到导入的项目,并且我在错误消息中看到 MSBuild 尝试从项目目录导入,而不是从子目录 Subdir 导入。
如果我取消注释这一行:
<Import Project="..\Directory.Build.props" />
Run Code Online (Sandbox Code Playgroud)
一切正常。
对我来说,这种行为的唯一合理解释是 aProperty 在导入时为空,因为显式导入发生在隐式导入之前。
在 Visual Studio 中工作时,有什么方法可以强制 MSBuild 在任何其他导入之前隐式导入 Directory.Build.props ?
我读到适应VS 2019的扩展非常容易-https: //devblogs.microsoft.com/visualstudio/visual-studio-extensions-and-version-ranges-demystified/#。
但是,如果我从帖子中执行所有操作,则会出错:
无法安装,因为没有以下链接:Microsoft.VisualStudio.Component.CoreEditor。
该帖子的作者在修改其扩展名时显示的行完全相同:
<Prerequisite Id="Microsoft.VisualStudio.Component.CoreEditor" Version="[15.0,)" />
Run Code Online (Sandbox Code Playgroud)
因此,看来这个先决条件对他来说不是问题。
我更新的extension.vsixmanifest是:
<?xml version="1.0" encoding="utf-8"?>
<PackageManifest Version="2.0.0" xmlns="http://schemas.microsoft.com/developer/vsx-schema/2011">
<Metadata>
<Identity Id="PowerQuerySDK.Microsoft.30831070-f420-4649-a031-6f679996b182" Version="1.0.0.20" Language="en-US" Publisher="Microsoft" />
<DisplayName>Power Query SDK</DisplayName>
<Description xml:space="preserve">A Power Query language service for Visual Studio</Description>
<License>Microsoft Power Query SDK - Pre-Release or Evaluation Use Terms.rtf</License>
<Icon>dataconnector_128.png</Icon>
<PreviewImage>EATIcon.ico</PreviewImage>
</Metadata>
<Installation>
<InstallationTarget Id="Microsoft.VisualStudio.Community" Version="[14.0,17.0)" />
<InstallationTarget Version="[14.0,17.0)" Id="Microsoft.VisualStudio.Pro" />
<InstallationTarget Version="[14.0,17.0)" Id="Microsoft.VisualStudio.Enterprise" />
</Installation>
<Dependencies>
<Dependency Id="Microsoft.Framework.NDP" DisplayName="Microsoft .NET Framework" Version="[4.5,)" />
</Dependencies>
<Assets>
<Asset Type="Microsoft.VisualStudio.ProjectTemplate" Path="ProjectTemplates" />
<Asset …
Run Code Online (Sandbox Code Playgroud) 我需要 Regexp,而 M / Power Query 没有对其的本机支持。我发现了围绕同一个优秀的 Web.Page & JavaScript 想法的几种解决方案变体 - Biccauntant、Hugoberry。
由于 JavaScript 的限制,我不得不采用它们(生成的代码如下)。
主要问题是 JavaScript 对字符串变量有自己的限制 - 不可能在其中使用“\”。
我的变体解决了这个问题,但我对 JS 并不专业,所以主要问题是 - 我怀疑“\”问题并不是唯一的问题。
所以我的问题是 - 在使用 Regexp 时是否有人看到 PQ 和 JavaScript“合作”的其他问题?关于字符串的其他陷阱,或者其他什么?
我知道 Regexp 有它自己的转义规则(这不仅是 JavaScript 的需求,而且是 Regexp 本身),因此 Regex 本身的转义超出了问题的范围。即,在将正则表达式作为函数参数传递之前,应对其进行正确转义。换句话说,假设如果用户想要使用带有“\”的正则表达式,他必须使用“\\”代替,我的函数会将其转换为“\\\\”,它将传递给JavaScript 作为正则表达式。
对于 PQ 用户 - 事实证明,该解决方案的性能至少对于数百行来说相当不错。但请不要忘记,无法在 Power BI 服务中使用该功能,这仅适用于 PowerBI Desktop 和 Excel。
代码:
(text as nullable text, pattern as nullable text) as logical =>
let
l = List.Transform({text, pattern}, each Text.Replace(_, "\", "\\")), …
Run Code Online (Sandbox Code Playgroud)如果我的项目文件没有任何目标,并且我在适当的目录中有 Directory.Build.targets 文件(具有适当的目标),则 Visual Studio 无法构建项目。VS的版本是2019RC,但我不认为这是特定版本的问题
这是预期的行为吗?为什么?
更新 - 项目的完整结构。一般来说,这是从“Power Query SDK”的“数据连接器项目”模板修改的项目 - https://marketplace.visualstudio.com/items?itemName=Dakahn.PowerQuerySDK
项目名称是PQExtensionTest。它具有典型的文件夹结构 - PQExtensionTest 解决方案目录、内部 PQExtensionTest.sln 文件和包含 PQExtensionTest.mroj 和 Directory.build.targets 文件的 PQExtensionTest 项目目录。
PQExtensionTest.sln 文件:
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.28010.2046
MinimumVisualStudioVersion = 10.0.40219.1
Project("{4DF76451-A46A-4C0B-BE03-459FAAFA07E6}") = "PQExtensionTest", "PQExtensionTest\PQExtensionTest.mproj", "{6DEC2A2E-C380-4701-AA12-5052284223E4}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x86 = Debug|x86
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{6DEC2A2E-C380-4701-AA12-5052284223E4}.Debug|x86.ActiveCfg = Debug|x86
{6DEC2A2E-C380-4701-AA12-5052284223E4}.Debug|x86.Build.0 = Debug|x86
{6DEC2A2E-C380-4701-AA12-5052284223E4}.Release|x86.ActiveCfg = Release|x86
{6DEC2A2E-C380-4701-AA12-5052284223E4}.Release|x86.Build.0 = Release|x86
EndGlobalSection
GlobalSection(SolutionProperties) …
Run Code Online (Sandbox Code Playgroud)