小编dea*_*dog的帖子

如何使Grunt Deploy使用全局NPM模块而不是本地模块

首先,我是npm和grunt的新手.我们有一个项目,我们正在使用Grunt来编译和生成输出文件.我正在尝试设置我们的构建服务器以使用Grunt生成输出文件.我们正在使用带有TFS源代码控制的Windows,并且由于它有260个字符的路径限制,我们无法将grunt-bower-task模块检查到源代码控制中(因为它在其安装路径中仅使用230个字符).

当我从我的项目目录运行npm install时,它工作正常,并将以下必需的模块安装到我的项目目录中的node_modules文件夹中:

  • 咕噜
  • 咕噜鲍尔任务
  • 咕噜-的contrib罗盘
  • 咕噜-的contrib-CONNECT
  • 咕噜-的contrib-jshint
  • 咕噜-的contrib-requirejs
  • 咕噜-的contrib手表

然后当我从我的项目目录运行grunt deploy时,一切都按预期工作.

虽然我可以简单地运行npm install部分构建过程,但我不愿意,因为下载所有文件需要几分钟,而且我不希望我们的构建依赖于可用的外部Web服务.

我已经看到你可以在本地或全局安装模块,所以我希望能够在构建服务器上全局安装模块,这样它们就不需要直接在项目目录中的node_modules文件夹中.运行grunt部署.我为上面列出的每个模块运行了npm install -g,以及npm install -g [module],以及npm install -g grunt-cli.

如果我执行npm前缀-g,它会告诉我全局模块目录是C:\ Users [我的用户]\AppData\Roaming \npm,当我查看该目录的node_modules文件夹时,我确实看到了所有模块.但是,当我运行grunt deploy时,它抱怨:

致命错误:无法找到当地的咕噜声

如果我只包含*node_modules\grunt*目录,那么我仍然会收到以下错误:

找不到本地Npm模块"grunt-contrib-watch".它安装了吗?

找不到本地Npm模块"grunt-contrib-jshint".它安装了吗?

...

我也尝试使用*grunt deploy --base"C:\ Users [我的用户]\AppData\Roaming \npm",但它抱怨说它找不到其他文件,例如.jshintrc.

那么有没有办法让我可以运行grunt deploy并让它检查模块的npm全局前缀路径,而不是查看项目目录?

一个hacky的工作是在构建过程中手动将模块复制到本地项目目录,但我想尽可能避免这种情况.

作为参考,这是我的package.json文件的样子:

{
  "name": "MyProject",
  "version": "0.0.1", …
Run Code Online (Sandbox Code Playgroud)

module node.js npm gruntjs

27
推荐指数
3
解决办法
1万
查看次数

PowerShell更改返回对象的类型

我正在使用PowerShell v3和Windows PowerShell ISE.我有以下功能正常工作:

function Get-XmlNode([xml]$XmlDocument, [string]$NodePath, [string]$NamespaceURI = "", [string]$NodeSeparatorCharacter = '.')
{
    # If a Namespace URI was not given, use the Xml document's default namespace.
    if ([string]::IsNullOrEmpty($NamespaceURI)) { $NamespaceURI = $XmlDocument.DocumentElement.NamespaceURI }   

    # In order for SelectSingleNode() to actually work, we need to use the fully qualified node path along with an Xml Namespace Manager, so set them up.
    [System.Xml.XmlNamespaceManager]$xmlNsManager = New-Object System.Xml.XmlNamespaceManager($XmlDocument.NameTable)
    $xmlNsManager.AddNamespace("ns", $NamespaceURI)

    [string]$fullyQualifiedNodePath = Get-FullyQualifiedXmlNodePath -NodePath $NodePath -NodeSeparatorCharacter $NodeSeparatorCharacter

    # Try and get the …
Run Code Online (Sandbox Code Playgroud)

powershell function return-type powershell-ise powershell-3.0

17
推荐指数
1
解决办法
1万
查看次数

.Net MAUI 用户设置的保存位置

在 Windows 窗体和 WPF 应用程序中,我们可以使用设置设计器文件来保存用户特定的设置。该文档仅提到 .Net Framework(例如 1 - 4),而不是 .Net Core 或 .Net(例如 5+)。我已经确认 .settings 格式和设计器仍然可以在使用 Visual Studio 2022 的 Windows 上的 .Net 6 WPF 中工作。

我的问题是,文件格式和设计器仍然是.Net MAUI.settings应用程序的推荐方法吗?它可以在所有平台(Windows、macOS、移动设备)上运行吗?如果没有,建议的方法是简单地编写自己的自定义文件来保存用户设置,如果是,该文件应该写入哪里?/ , 或者别的地方?Environment.SpecialFolder.ApplicationDataEnvironment.SpecialFolder.LocalApplicationData

.net settings maui

17
推荐指数
2
解决办法
1万
查看次数

C#具有异步函数调用同步函数或同步函数调用异步函数

我正在编写一个C#.Net 4.5库,用于执行常见的SQL数据库操作(备份,恢复,执行脚本等).我希望每个操作都有同步和异步函数,因为这个库将由控制台和GUI应用程序使用,但我不想在任何地方重复代码.所以我看到它,我有两个选择:

  1. 编写在同步函数中执行工作的代码,然后将其包装在async函数的任务中,如下所示:

    public void BackupDB(string server, string db)  
    {  
        // Do all of the work and long running operation here  
    }
    
    public async Task BackupDBAsync(string server, string db)  
    {  
        await Task.Factory.StartNew(() => BackupDB(server, db)).ConfigureAwait(false);  
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 编写在异步函数中执行工作的代码,并使用.Wait()从同步函数中调用它:

    public async Task BackupDBAsync(string server, string db)  
    {  
        // Do all of the work and long running operation here, asynchronously.  
    }
    
    public void BackupDB(string server, string db)  
    {  
        BackupDBAsync(server, db).Wait(); // Execution will wait here until async function finishes completely.  
    }
    
    Run Code Online (Sandbox Code Playgroud)

一种选择比另一种更好吗?这是一个最佳实践吗?或者还有其他(更好的)替代方案吗?

我知道使用.Wait()的一个警告是async函数中的所有await语句都必须使用.ConfigureAwait(false)来避免死锁( …

c# asynchronous synchronous async-await .net-4.5

16
推荐指数
1
解决办法
1万
查看次数

如何在PowerShell的Get-ChildItem -Exclude cmdlet中使用通配符和目录

举个简单的例子,假设我有一个文件夹Root,里面有三个文件夹; Folder1,Folder2和Folder3.这些文件夹(包括Root)中的每一个都包含一堆文件,包括.pdb文件.我想使用PowerShell Get-ChildItem cmdlet返回所有文件夹(包括Root)中的所有文件,但Folder2中的.pdb文件除外.如果我使用:

Get-ChildItem -Path C:\Root -Recurse -Exclude *.pdb
Run Code Online (Sandbox Code Playgroud)

然后我回到所有目录中的所有非.pdb文件,这接近我想要的.所以我假设以下内容将实现我想要的:

Get-ChildItem -Path C:\Root -Recurse -Exclude \*\\Folder2\\*.pdb
Run Code Online (Sandbox Code Playgroud)

但这并不排除Folder2(或任何其他文件夹)中的任何pdb文件.我已经为-Exclude过滤器尝试了几种变体,例如Folder2\\\*.pdb,但我无法让它工作.事实上,即使使用\*\\\*.pdb似乎也没有做任何事情; 没有.pdb文件从任何文件夹中排除.

所以似乎通配符不能用于目录,只能用于文件名,但我认为我只是做错了.我发现这篇文章解释了通配符和范围操作符,但不幸的是它没有讨论将它们与目录名一起使用; 只有文件名.

directory powershell get-childitem

9
推荐指数
3
解决办法
3万
查看次数

PowerShell - 将可执行文件的stderr重定向到文件或变量,但仍然有stdout转到控制台

我正在写一个脚本从GitHub下载几个存储库.以下是下载存储库的命令:

git clone "$RepositoryUrl" "$localRepoDirectory"
Run Code Online (Sandbox Code Playgroud)

当我运行此命令时,它会在我想要显示的控制台窗口中显示一些很好的进度信息.

问题是我还希望能够检测下载时是否发生任何错误.我发现这篇文章谈到重定向各种流,所以我试过:

(git clone "$RepositoryUrl" "$localRepoDirectory") 2> $errorLogFilePath
Run Code Online (Sandbox Code Playgroud)

这会将stderr中的任何错误传递给我的文件,但不再在控制台中显示好的进度信息.

我可以这样使用Tee-Object:

(git clone "$RepositoryUrl" "$localRepoDirectory") | Tee-Object -FilePath $errorLogFilePath
Run Code Online (Sandbox Code Playgroud)

我仍然得到了很好的进度输出,但是这会将stdout传递给文件,而不是stderr; 我只关心检测错误.

有没有办法可以存储文件或(最好)变量中发生的任何错误,同时还有进度信息传递到控制台窗口?我有一种感觉,答案可能在于将各种流重定向到其他流中,如本文中的讨论,但我不太确定.

========更新=======

我不确定git.exe是否与典型的可执行文件不同,但我已经做了一些测试,这是我发现的:

$output = (git clone "$RepositoryUrl" "$localRepoDirectory")
Run Code Online (Sandbox Code Playgroud)

$ output始终包含文本"Cloning into'[localRepoDirectory]'...",无论命令是成功完成还是产生错误.此外,执行此操作时,仍会将进度信息写入控制台.这让我认为进度信息不是通过stdout写的,而是通过其他一些流写的?

如果发生错误,则错误将写入控制台,但采用通常的白色前景色,不是典型的红色表示错误,黄色表示警告.当从cmdlet函数中调用此函数并且命令因错误而失败时,错误不会通过函数的-ErrorVariable(或-WarningVariable)参数返回(但是,如果我执行自己的Write-Error,则会通过-ErrorVariable返回).这让我觉得git.exe没有写入stderr,但是当我们这样做时:

(git clone "$RepositoryUrl" "$localRepoDirectory") 2> $errorLogFilePath
Run Code Online (Sandbox Code Playgroud)

错误消息被写入文件,这使我认为它写入stderr.所以现在我很困惑......

========更新2 =======

因此,在Byron的帮助下,我尝试了一些使用新流程的解决方案,但仍然无法获得我想要的东西.使用新进程时,我永远无法将好的进度写入控制台.

我尝试过的三种新方法都使用了这个共同的代码:

$process = New-Object System.Diagnostics.Process
$process.StartInfo.Arguments = "clone ""$RepositoryUrl"" ""$localRepoDirectory"""
$process.StartInfo.UseShellExecute = $false
$process.StartInfo.RedirectStandardOutput = $true
$process.StartInfo.RedirectStandardError = $true
$process.StartInfo.CreateNoWindow = $true
$process.StartInfo.WorkingDirectory = $WORKING_DIRECTORY
$process.StartInfo.FileName = "git" …
Run Code Online (Sandbox Code Playgroud)

powershell redirect stream stderr powershell-3.0

8
推荐指数
1
解决办法
8261
查看次数

TFS Build无法找到Grunt

我在我们的TFS构建服务器上安装了npm和grunt.我使用npm install -g grunt-cli安装了grunt-cli,然后在以我自己的身份登录时能够从命令行运行grunt deploy.

Out TFS版本作为tfsservice用户运行,当它尝试执行grunt部署时,它会收到一条错误消息:

'grunt' is not recognized as an internal or external command, operable program or batch file.
Run Code Online (Sandbox Code Playgroud)

所以,当我在构建服务器上以我自己的身份登录时,如果我将命令提示符作为tfsservice运行,我会得到相同的错误.所以我尝试从命令提示符下执行npm install -g grunt-cli,它看起来已经正确安装并在C:\ Users\tfsservice\AppData\Roaming \npm中创建了grunt文件,但是后来我仍然得到了同样的错误当运行grunt部署时.

所以看起来grunt-cli没有为tfsservice安装?当我得到tfsservice%homepath%时,我看到它被设置为\ Windows\system32,而不是预期的\ Users\tfsservice ; 也许这是一个服务帐户与它有关?

我看到类似的问题已被要求在团队城市中使用grunt-cli,但它建议使用Team City特定的插件.

还有这篇帖子说他们改变了Team City作为一个不同的用户运行,然后一切都开始正常工作.尽管如此,将我们的构建更改为以不同于tfsservice的用户身份运行并不是一个真正的选择.

任何建议表示赞赏.谢谢.

tfs node.js npm grunt-cli

6
推荐指数
1
解决办法
3466
查看次数

PowerShell使用Start-Process在脚本块中执行函数会使用双引号进行奇怪的操作

我有一个编辑注册表的PowerShell脚本,所以它需要以管理员身份运行.为此,我从运行的PowerShell脚本启动一个新的PowerShell进程,并使用带有函数的脚本块传递部分注册表键路径.当我在该函数中使用双引号时,PowerShell会尝试将它们解释为命令,而不是字符串.如果我使用单引号,那么一切正常.

我创建了一个简单的样本PowerShell脚本来重现问题.这是片段:

$ScriptBlock = {
    function Test
    {
        $status = "This is a string"
        Write-Output $status
    }
}
Start-Process -FilePath PowerShell -ArgumentList "-NoExit -NoProfile -ExecutionPolicy Bypass -Command & {$ScriptBlock Test}"
Run Code Online (Sandbox Code Playgroud)

因此,在新的PowerShell流程中,它将首先在脚本块中定义代码,然后调用Test方法,并产生以下错误:

这:术语"This"不被识别为cmdlet,函数,脚本文件或可操作程序的名称.检查名称的拼写,或者如果包含路径,请验证路径是否正确,然后重试.

所以它试图将字符串视为一个commad,就好像我刚刚This is a string在我的脚本中的新行上键入它一样.

如果我换行

$status = "This is a string"
Run Code Online (Sandbox Code Playgroud)

$status = 'This is a string'
Run Code Online (Sandbox Code Playgroud)

该脚本按预期工作,只是输出字符串This is a string.

我注意到的另一个奇怪的问题是,如果我不使用变量,只需使用:

Write-Output "This is a string"
Run Code Online (Sandbox Code Playgroud)

然后它在一个单独的行上输出每个单词,如下所示:

这个

一个

但如果我使用这样的单引号:

Write-Output 'This is a string'
Run Code Online (Sandbox Code Playgroud)

然后它按预期在一行输出整个句子.

有人知道为什么PowerShell在这些情况下会表现得很奇怪吗?

回答

正如TessellatingHeckler所提到的,解决方案是用双引号,单引号包装任何双引号,或者你可以使用括号.

所以在我的例子中,你会改变: …

string powershell function start-process scriptblock

6
推荐指数
1
解决办法
8702
查看次数

如何在接口或基类中定义具有固定大小的数组

我正在制作一个宾果游戏,而在宾果游戏中,一张卡是一个5x5的数字网格(减去"免费"中心空间).我正在寻找一种以强类型方式表示5x5网格的方法.它可能是5x5网格的整数,bool,某些类等.我最初的想法是使用二维数组,但这有一个问题,我不允许指定大小所以当传递对象时,有其他类无法知道它应该有5行和5列.

例如,我可能会创建接口:

public interface ICard
{
    int[,] cells { get; }
}
Run Code Online (Sandbox Code Playgroud)

但是没有在这里明确声明整数数组有5行和5列.另外,为了定义匹配的模式,我可能会使用5x5的布尔网格,所以我希望它看起来像这样:

public interface ICard<T>
{
    T[,] cells { get; }
}
Run Code Online (Sandbox Code Playgroud)

那么我该如何改变它来代替返回一个强类型的Card对象,该对象强制执行应该只有5行和5列的规则,并使其显而易见.我认为我的问题的答案是创建一个新的Card类,但我不确定如何以优雅的方式执行它,强制执行并显示它是5x5网格.

任何想法都表示赞赏.谢谢.

衍生答案

感谢所有提供答案的人.根据所有答案,我提出了一些混合方法.这是我最终做的事情:

创建了一个新的通用Matrix接口和类:

public interface IMatrix<T>
{
    int NumberOfColumns { get; }
    int NumberOfRows { get; }
    T GetCell(int column, int row);
    void SetCell(int column, int row, T value);
}

public class Matrix<T> : IMatrix<T>
{
    protected readonly T[,] Cells;

    public int NumberOfColumns { get; }
    public int NumberOfRows { get; }

    public Matrix(int numberOfColumns, …
Run Code Online (Sandbox Code Playgroud)

c# arrays

6
推荐指数
1
解决办法
2399
查看次数

WPF ListBox VirtualizingStackPanel.VirtualizationMode ="Recycling"导致始终显示相同的列表项

我正在使用WPF/.NET 4,当我将VirtualizingStackPanel.VirtualizationMode ="Recycling"属性添加到我的ListBoxes时,它会导致相同的列表项在滚动时反复重复.例如,假设我有一个包含100个项目的ListBox,一次可见10个.当ListBox首次加载时,我看到项目1 - 10,但当我开始向下滚动以查看剩余项目11 - 100时,项目1 - 10在我向下滚动时反复重复,所以我永远无法查看项目11 - 100.如果我将Recycling更改回Standard,那么一切正常,但滚动速度非常慢(我的ListItems相当复杂,其中有几个图像,文本字段和按钮).当回收打开时,滚动速度非常快,但我只能查看项目1 - 10.任何有关错误或如何修复的想法?提前致谢.

.net wpf virtualization listbox recycle

5
推荐指数
1
解决办法
2965
查看次数