在交互式控制台中工作时,如果我定义一个新对象并为其分配一些属性值,如下所示:
$obj = New-Object System.String
$obj | Add-Member NoteProperty SomeProperty "Test"
Run Code Online (Sandbox Code Playgroud)
然后,当我在交互式窗口中键入我的变量名称时,Powershell为我提供了对象属性和值的摘要:
PS C:\demo> $obj
SomeProperty
------------
Test
Run Code Online (Sandbox Code Playgroud)
我基本上想要这样做,但是从脚本中的函数内部做.该函数创建一个对象并设置一些属性值,我希望它在返回之前将对象值的摘要打印到Powershell窗口.我尝试在函数中使用Write-Host:
Write-Host $obj
Run Code Online (Sandbox Code Playgroud)
但这只是输出对象的类型而不是摘要:
System.Object
Run Code Online (Sandbox Code Playgroud)
如何让我的函数输出对象属性值的摘要到Powershell窗口?
安装Visual Studio 2015后,我可以使用新的编辑器功能,根据此文档,在Web项目中添加依赖关系到Node包和恢复等:http: //webtooling.visualstudio.com/package-managers/npm/
大概Visual Studio必须在某处安装node/npm以支持这些功能,但是它似乎没有修改我的PATH以在命令行上(或通过Visual Studio 2015命令提示符)提供这些工具.
如果我想从命令行对我的项目执行一些npm操作,我可以在不再安装node/npm的情况下执行此操作(这可能与Visual Studio正在使用的npm/node版本不同步)或者是否有办法访问Visual Studio从命令行使用的节点/ npm安装?
我正在尝试配置Visual Studio Online以将我的ASPNET 5应用程序连续部署到Azure webapp,如本教程中所述,来自Team Foundation Build文档:https://msdn.microsoft.com/Library/vs/alm/Build/天蓝色/部署,aspnet5
我已经完成了所有步骤,一切都很顺利.默认情况下,此脚本部署我的应用程序版本,该应用程序以完整的.Net 4.5.1 DNX为目标,因此我决定尝试修改它以部署.Net Core.
构建脚本通过调用以下方式创建其部署包:msbuild.exe /t:Build,FileSystemPublish
在调高日志详细程度并阅读相关的msbuild文件后,我学到了以下内容:
"Build"目标最终使用dnx.exe来编译项目.因为project.json文件包含dnx451和coreclr TFM,所以这一步为两个框架产生了构建输出 - 到目前为止一直很好.
但是,FileSystemPublish目标似乎只输出一个针对.Net 4.5.1运行时的msdeploy包.从日志中我可以看到执行FileSystemPublish目标最终会发出"dnu publish"命令,在我的情况下,将"dnx-clr-win-x86.1.0.0-beta6"作为-runtime参数传递.当我按照面包屑找出它的位置时,我的值"dnx-clr-win-x86.1.0.0-beta6"最终出现在Microsoft.DNX.Tasks.dll中的"GetRuntimeToolingPath"任务中.此任务似乎在global.json中查找以确定要使用的正确运行时,但奇怪的是在创建返回字符串之前,在内部用"x86"和"clr"覆盖此值.
如果我正确地解释了事情,似乎FileSystemPublish目标(在Microsoft.DNX.Publishing.targets中)基本上(间接)硬连线,以便在生成其包输出时使用x86,完整的.Net框架DNX.在这一点上,我不知道如何让这个构建过程生成.Net Core包.
我的问题是为什么FileSystemPublish会与x86完整的.Net DNX耦合,并且考虑到这种情况(除非我弄错了)为ASPNet 5应用程序生成一个针对.Net核心的msdeploy包的推荐方法是什么?
编辑:
目前我有一个解决方法.我可以/p:RuntimeToolingDirectory="C:\Users\buildguest\.dnx\runtimes\dnx-coreclr-win-x64.1.0.0-beta6"作为参数传递给msbuild.这将覆盖GetRuntimeToolPath中的默认逻辑并强制它使用.Net Core.这有效,但感觉就像一个黑客,所以我将问题留给更好的答案.
我最近在Robert.C.Martin的优秀着作Agile Principals,C#中的模式和实践中读到了依赖性 - 倒置主体.然而,这个原则的一个方面我觉得我不完全理解.
Robert解释说,当高级模块依赖于较低级别的模块时,较低级别模块的更改可能会导致更高级别的模块也发生变化.他通过以下示例演示了这一点:
public class Button
{
private Lamp lamp;
public void Poll(){
if(/*some condition*/)
Lamp.TurnOn();
}
}
Run Code Online (Sandbox Code Playgroud)
关于这段代码罗伯特说:"Button类直接依赖于Lamp类.这种依赖性意味着Button会受到Lamp变化的影响."
正如我所看到的,我们可能会对Lamp类进行两种可能的更改:
1)我们可能想要更改类的内部实现,但不会影响公共接口.
2)我们可能决定更改公共接口以将参数传递给TurnOn方法.
我不明白的是,在第一种情况下,为什么我们的更改会导致Button类的更改?Lamp的公共接口没有改变,为什么Button需要改变?
在第二种情况下,我可以看到这将需要我们更改Button.但在这种情况下,取决于抽象如何改变这一点?当然,如果我有正当理由将接口更改为Lamp,那么我也将改变Lamp和Button所依赖的抽象中的界面.在这种情况下,我必须改变Button,因为它依赖的抽象已经改变.
我意识到DIP还有其他好处,例如更高级别模块的可重用性,更高级别模块的接口所有权以及在运行时选择依赖项实现的能力,但是我很难理解DIP如何减少依赖的需求当到较低级别模块的接口改变时改变的模块和/或从属模块中的内部改变可能导致更高级别模块的改变的原因.
我一直在此处和此处阅读有关 chrome 中的关键渲染路径的内容。我对这些资源的理解是,“合成”步骤发生在主线程之外,并且依赖于先前的“绘制”步骤,该步骤生成要合成在一起的光栅化层。
然而,当我在 Chrome 开发工具中查看位置动画的单帧期间发生的情况时,我看到了以下内容:
那么“绘画”和“光栅化绘画”之间有什么区别,为什么光栅化绘画步骤会在合成完成后发生?为什么合成似乎发生在 chrome 开发工具的主线程上,但文档将其描述为发生在不同的线程上?
如果我设置一个非常简单的webpack项目并安装webpack-dev-server,当我从命令行或通过npm脚本运行"webpack-dev-server --open"时,默认情况下会重新加载.即只要我编辑源文件,就会重建捆绑包并自动重新加载浏览器.
但是,如果我使用Node API来启动webpack-dev-server,请使用以下代码:
const WebpackDevServer = require('webpack-dev-server');
const webpack = require('webpack');
const webpackConfig = require('../webpack.config.dev');
const open = require('open');
const port = 3000;
let compiler = webpack(webpackConfig);
let server = new WebpackDevServer(compiler, {
contentBase: "./src",
});
server.listen(port, "localhost", function(err) {
if(err){
console.log(err);
}
else{
open('http://localhost:' + port);
}
});
Run Code Online (Sandbox Code Playgroud)
我放松了实时重装.当我更改源文件时,我可以看到webpack从命令行输出重建包,但浏览器不会刷新.
请注意,在我的情况下,不需要热模块重新加载,实际上是不可取的.我只是希望页面在使用webpack-dev-server CLI时完全按照默认情况进行刷新.
asp.net-core ×2
azure-devops ×1
dependencies ×1
msbuild ×1
msdeploy ×1
npm ×1
packaging ×1
powershell ×1
webpack ×1