我需要在构建时运行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=""--msg-template={abspath}({line},{column}): warning {msg_id}: {msg} [{C}:{symbol}]" -r n @(Compile, ' ')"
ExecuteIn="console"
WorkingDirectory="$(MSBuildProjectDirectory)"
WarningRegex="$(PyLintWarningRegex)"
RequiredPackages="pylint>=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)
答案 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=""--msg-template={path}({line},{column}): warning: [{msg_id}{obj}] {msg}" -r n @(Compile, ' ')"
ExecuteIn="console"
WorkingDirectory="$(MSBuildProjectDirectory)"
RequiredPackages="pylint>=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)) & "$(InterpreterPath)" -m pylint.lint "--msg-template={path}({line},{column}): warning: [{msg_id}{obj}] {msg}" -r n @(Compile, ' ')"
WorkingDirectory="$(MSBuildProjectDirectory)"
IgnoreExitCode="true" />
</Target>
答案 3 :(得分:0)
这个问题很老,但是我花了一些时间在这个问题上。 我建议对@Nmktronas接受的答案进行一些改进,以解决以下问题:
请参见代码段中的注释。
<!-- 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=""--msg-template={path}({line},{column}): warning: [{msg_id}{obj}] {msg}" -r n @(Compile, ' ')"
ExecuteIn="none"
WorkingDirectory="$(MSBuildProjectDirectory)"
RequiredPackages="pylint>=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>