如何使用MsBuild构建PyLint for .pyproj?

时间:2015-10-13 20:48:54

标签: python msbuild pylint ptvs

我需要在构建时运行PyLint来验证我的Python文件代码。 python文件在.pyproj下(我使用Visual Studio 2015的Python工具)。我怎么能这样做?

更新

到目前为止,我的代码是这样的:

<Target Name="PythonRunPyLint">
    <PropertyGroup>
        <PyLintWarningRegex><![CDATA[^(?<filename>.+?)\((?<line>\d+),(?<column>\d+)\): warning (?<msg_id>.+?): (?<message>.+?)$]]></PyLintWarningRegex>
    </PropertyGroup>
    <RunPythonCommand Target="pylint.lint"
                             TargetType="module"
                             Arguments="&quot;--msg-template={abspath}({line},{column}): warning {msg_id}: {msg} [{C}:{symbol}]&quot; -r n @(Compile, ' ')"
                             ExecuteIn="console"
                             WorkingDirectory="$(MSBuildProjectDirectory)"
                             WarningRegex="$(PyLintWarningRegex)"
                             RequiredPackages="pylint&gt;=1.0.0"> 
        <Output TaskParameter="ConsoleOutput" PropertyName="OutputText" />
        <Output TaskParameter="ConsoleError" PropertyName="ErrorText" />
    </RunPythonCommand>
</Target>

但是,当我运行msbuild时,我得到输出并且有0个警告,为什么正则表达式不解析警告(正则表达式取自Microsoft.PythonTools.targets,它在工具&gt;在Visual Studio中运行PyLint时有效)?

C:\>msbuild TestPylint.pyproj /t:Build
Microsoft (R) Build Engine version 14.0.23107.0
Copyright (C) Microsoft Corporation. All rights reserved.

Build started 15/10/2015 20:10:26.
Project "C:\TestPylint.pyproj" on node 1 (Build target(s)).
PythonRunPyLint:
************* Module TestPylint
C:\TestPylint.py(2,0): warning C0304: Final newline missing [C:missing-final-newline]
C:\TestPylint.py(1,0): warning C0111: Missing module docstring [C:missing-docstring]
No config file found, using default configuration
Done Building Project "C:\TestPylint.pyproj" (Build target(s)) -- FAILED.

Build FAILED.
    0 Warning(s)
    0 Error(s)

4 个答案:

答案 0 :(得分:1)

它没有开箱即用,但如果您愿意,可以将它添加到您的项目中。找到Microsoft.PythonTools.targets,然后在里面找到<Target Name="PythonRunPyLintCommand" ...。将其复制到您的项目,将其重命名为“PythonRunPyLint”,并在其中用CreatePythonCommandItem替换RunPythonCommand。您可能还必须删除该元素的某些属性(基本上任何MSBuild都不会抱怨),并删除子<Output>

然后开始使用该目标进行构建。

答案 1 :(得分:0)

我最终得到了以下代码:

<Target Name="Build">
    <RunPythonCommand Target="pylint.lint"
                         TargetType="module"
                         Arguments="&quot;--msg-template={path}({line},{column}): warning: [{msg_id}{obj}] {msg}&quot; -r n @(Compile, ' ')"
                         ExecuteIn="console"
                         WorkingDirectory="$(MSBuildProjectDirectory)"
                         RequiredPackages="pylint&gt;=1.0.0"
                         ConsoleToMSBuild="true"
                         ContinueOnError="true">
          <Output TaskParameter="ConsoleOutput" ItemName="OutputText" />
          <Output TaskParameter="ConsoleError" PropertyName="ErrorText" />
    </RunPythonCommand>
     <WriteLinesToFile
            File="lint_output.txt"
            Lines="@(OutputText)"
            Overwrite="true"
            Encoding="Unicode"/>
     <Exec ContinueOnError="true"
          IgnoreExitCode="true"
          Command='type lint_output.txt'/>
  </Target>

现在msbuild TestPylint.pyproj /t:Build计算错误/警告,同时在Visual Studio错误列表窗口中显示错误/警告。

使用了WriteLinesToFile任务,因为我没有找到任何其他方法让msbuild识别错误/警告<Exec Command="echo $(OutputText)/>(如果OutputText是属性)根本不起作用!

答案 2 :(得分:0)

@Nmktronas提出的解决方案略有不同。

<Target Name="CoreCompile">
  <ResolveEnvironment ContinueOnError="WarnAndContinue">
    <Output TaskParameter="InterpreterPath" PropertyName="InterpreterPath" />
  </ResolveEnvironment>
  <Exec Condition="Exists($(InterpreterPath))"
        Command="(set PYTHONPATH=$(SearchPath)) &amp; &quot;$(InterpreterPath)&quot; -m pylint.lint &quot;--msg-template={path}({line},{column}): warning: [{msg_id}{obj}] {msg}&quot; -r n @(Compile, ' ')"
        WorkingDirectory="$(MSBuildProjectDirectory)"
        IgnoreExitCode="true" />
</Target>

答案 3 :(得分:0)

这个问题很老,但是我花了一些时间在这个问题上。 我建议对@Nmktronas接受的答案进行一些改进,以解决以下问题:

  1. PyLint仅在重建命令之后运行,而不在构建命令之后运行。
  2. 在构建过程中讨厌控制台窗口弹出窗口。

请参见代码段中的注释。

  <!-- Problem: PyLint is running only for Rebuild command, and never runs for Build command.
       Solution: https://github.com/Microsoft/PTVS/issues/816: "The Outputs parameter of Target 
         node won't work, but if you add an item group called OutputFiles then we will compare 
         date/time stamps against those when deciding to build." -->
  <ItemGroup>
    <!-- Visible="false" prevents the file from showing in the Solution Window.-->
    <OutputFiles Include="lint_output.txt" 
                 Visible="false"/>
  </ItemGroup>

  <Target Name="BeforeBuild">
    <!-- ExecuteIn="none" value prevents appearance of the Console window. -->
    <RunPythonCommand Target="pylint.lint"
                      TargetType="module"
                      Arguments="&quot;--msg-template={path}({line},{column}): warning: [{msg_id}{obj}] {msg}&quot; -r n @(Compile, ' ')"
                      ExecuteIn="none"
                      WorkingDirectory="$(MSBuildProjectDirectory)"
                      RequiredPackages="pylint&gt;=1.0.0"
                      ConsoleToMSBuild="true"
                      ContinueOnError="true">
      <Output TaskParameter="ConsoleOutput" ItemName="OutputText" />
      <Output TaskParameter="ConsoleError" PropertyName="ErrorText" />
    </RunPythonCommand>
    <WriteLinesToFile File="lint_output.txt"
                      Lines="@(OutputText)"
                      Overwrite="true"
                      Encoding="Unicode"/>
    <Exec ContinueOnError="true"
          IgnoreExitCode="true"
          Command='type lint_output.txt'/>
  </Target>